【发布时间】:2021-01-09 00:45:56
【问题描述】:
我知道这个问题已经被无休止地问过了,但仍然存在。我想我错过了什么。 当我们想要以异步方式更新 UI(为了参数而使用 WinForm UI)时。但是我们不能使用 async /await 关键字,我们必须使用 ConfigureAwait(false)。据我了解,它“告诉”它可以在任何可用线程上恢复自身而不是等待主线程的任务。它通过释放 UI 来防止死锁,因为它不等待长进程完成并且任务不等待主 UI 线程可用。
以下代码演示了经典的死锁
public void Button_Click()
{
SomeTextBox.Text =LongProcessAsync().Result;
}
所以现在我的问题开始了:)。长时间处理任务完成后,UI 线程最终如何更新 UI。
是因为任务将结果传递给另一个 UI 进程来完成工作吗? UI 队列消息如何与该部分相关? 当说只有一个线程更新 ui 时,这是否意味着该线程在应用程序的整个生命周期中都存在,或者只有一个线程正在更新 ui 但可以创建一个新线程并执行这些操作?
谢谢
【问题讨论】:
-
但是我们不能使用 async /await 关键字,我们必须使用 ConfigureAwait(false):谁告诉你的?任务的目的是什么?作品完成后更新 UI?然后,您需要以某种方式在 UI 线程中恢复。你想控制更新的时间,这样就不会在异步操作完成后立即发生吗?运行一个任务并使用
IProgress<T>委托来接收更新,一次或每次任务有新数据时,最终可以缓存。否则,使用 async/await 模式。很大程度上取决于操作的类型。
标签: asp.net multithreading winforms task task-parallel-library