C# 运行 Task.RunSynchronously() 在与调用它的线程不同的线程上

C# Run Task.RunSynchronously() on a different thread to where it was called

我正在开发基于 C# 的自动化桌面应用程序(使用 WPF),我遇到了一个问题。

自动化过程的计算量非常大,因此 WPF window 完全被冻结了。

是的,我查看了 运行 异步代码,但这会导致更多错误,因为代码 运行 比它应该的要早。

我需要的是 运行 在与 UI 不同线程上的代码,允许用户在应用 运行 运行时与其交互。

谢谢

好吧,答案取决于您是否需要将结果推回 UI 线程。

如果不是 - 使用 TPL,Parallel.For/ForEach 并行处理集合。方法 returns ParallelLoopResult,允许检查计算状态。参见 docs

如评论中所述,其他方式是使用 Task - Task.WhenAll/Task.WaitAll。虽然 WaitAll 本质上是同步的并且仍然会冻结您的应用程序,但 WhenAll 不是。我猜你遇到的问题与从非主线程访问 UI 有关,这需要使用 Dispatcher (有一种方法可以在主线程上将 Action 排队为 运行 )。一般建议 - 首先 await Task.WhenAll(...),然后使用 UI。

此外,请参阅 this article 了解更多线索。

事实证明,我正在从第二个线程访问 UI,根据 WPF,这是一个大问题。