C#: Task.Run 在主线程上执行
C#: Task.Run execute on main thread
我正在为 iOS 应用程序使用 monotouch/Xamarin。
Task.Run
的文档指出:
Queues the specified work to run on the ThreadPool and returns a task
handle for that work.
这基本上表明它可以 运行 在任何线程上 ThreadPool
。
我想做类似的事情:
Task.Run(async () => await PerformTask());
但在主线程上 运行。通常我会使用 BeginInvokeOnMainThread
编写它,如下所示:
BeginInvokeOnMainThread(async () => await PerformTask());
但我是在共享代码中执行此操作,不想使用 iOS 特定调用。有没有办法告诉 Task.Run() 在主线程上调用操作?
如果你想运行PerformTask
在当前线程中,而不是线程池线程,你只需要不调用Task.Run
.只需使用:
PerformTask();
大功告成。如果您只想在该任务完成后继续执行方法的其余部分,那么 await
it:
await PerformTask();
没有理由在这里为您调用 Task.Run
,也没有任何理由无缘无故地创建一个 awaits
该方法的 lambda(您可以直接调用它,如果您想从线程池线程启动它)。
看看MainQueue.cs:https://gist.github.com/gering/0aa9750d3c7d14b856d0ed2ba98374a8
它适用于 Xamarin Forms 应用程序。您必须从主线程调用 Init() 一次,但您可以确保在主线程上执行。
我正在为 iOS 应用程序使用 monotouch/Xamarin。
Task.Run
的文档指出:
Queues the specified work to run on the ThreadPool and returns a task handle for that work.
这基本上表明它可以 运行 在任何线程上 ThreadPool
。
我想做类似的事情:
Task.Run(async () => await PerformTask());
但在主线程上 运行。通常我会使用 BeginInvokeOnMainThread
编写它,如下所示:
BeginInvokeOnMainThread(async () => await PerformTask());
但我是在共享代码中执行此操作,不想使用 iOS 特定调用。有没有办法告诉 Task.Run() 在主线程上调用操作?
如果你想运行PerformTask
在当前线程中,而不是线程池线程,你只需要不调用Task.Run
.只需使用:
PerformTask();
大功告成。如果您只想在该任务完成后继续执行方法的其余部分,那么 await
it:
await PerformTask();
没有理由在这里为您调用 Task.Run
,也没有任何理由无缘无故地创建一个 awaits
该方法的 lambda(您可以直接调用它,如果您想从线程池线程启动它)。
看看MainQueue.cs:https://gist.github.com/gering/0aa9750d3c7d14b856d0ed2ba98374a8
它适用于 Xamarin Forms 应用程序。您必须从主线程调用 Init() 一次,但您可以确保在主线程上执行。