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,这是一个大问题。
我正在开发基于 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,这是一个大问题。