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() 一次,但您可以确保在主线程上执行。