我正在使用monotouch / Xamarin作为iOS应用程序。
Task.Run
州的文档:
将指定的工作排队以在ThreadPool上运行并返回任务 处理这项工作。
这基本上表明它可以在任何线程ThreadPool
上运行。
我想做类似的事情:
Task.Run(async () => await PerformTask());
但是它在主线程上运行。通常我会使用BeginInvokeOnMainThread
编写它,如下所示:
BeginInvokeOnMainThread(async () => await PerformTask());
但是我在共享代码中这样做,并且不想使用iOS特定的调用。有没有办法让我告诉Task.Run()在主线程上调用操作?
答案 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(),但是你可以确保在主线程上执行。