C#:Task.Run在主线程上执行

时间:2015-08-04 16:23:51

标签: c# ios xamarin.ios async-await task-parallel-library

我正在使用monotouch / Xamarin作为iOS应用程序。

Task.Run州的文档:

  

将指定的工作排队以在ThreadPool上运行并返回任务   处理这项工作。

这基本上表明它可以在任何线程ThreadPool上运行。

我想做类似的事情:

Task.Run(async () => await PerformTask());

但是它在主线程上运行。通常我会使用BeginInvokeOnMainThread编写它,如下所示:

BeginInvokeOnMainThread(async () => await PerformTask());

但是我在共享代码中这样做,并且不想使用iOS特定的调用。有没有办法让我告诉Task.Run()在主线程上调用操作?

2 个答案:

答案 0 :(得分:7)

如果要在当前线程中运行PerformTask而不是线程池线程,则只需要调用Task.Run。只需使用:

PerformTask();

你完成了。如果您只想在该任务完成后继续执行该方法的其余部分,那么await它:

await PerformTask();

没有理由在这里为你调用Task.Run,也没有理由在没有特殊原因的情况下创建一个awaits方法的lambda(你可以直接调用它,如果你想从线程池线程开始。)

答案 1 :(得分:1)

查看MainQueue.cs:https://gist.github.com/gering/0aa9750d3c7d14b856d0ed2ba98374a8

适用于Xamarin Forms应用程序。你必须从主线程调用一次Init(),但是你可以确保在主线程上执行。