【发布时间】:2019-06-14 19:12:13
【问题描述】:
我可以在调用 ConfigureAwait(false) 后在 Web 表单中进行 UI 更改吗?
protected async void btnX_onClick(object sender, EventArgs e)
{
await myTask();
}
protected async Task myTask() {
await anotherTask().ConfigureAwait(false);
lblTaskSuccess.Text = "Success"; // UI Change
}
我相信,如果 SynchronizationContext 是 UI(例如 Windows 应用程序),那么我将无法更改 UI。
由于这是一个 webform 项目,而 SynchronizationContext 是 aspnet,我可以进行 ui 更改(例如更改标签等)吗?
【问题讨论】:
-
你试过了吗?
-
我试过了,效果很好。我不确定它是否还有其他问题。
-
我认为如果你在 ConfigureAwait(false) 之后尝试使用
HttpContext.Current对象,因为它附加到一个线程,你可能会遇到问题。 -
最好的办法是继续使用 ConfigureAwait(false),直到你发现不兼容的东西。然后对于这种特定情况,请改用 ConfigureAwait(TRUE)。
-
configureAwait() 方法用于定义 await 语句之后的代码是否应该在调用任务之前在同一个线程上运行。由于
await myTask()之后没有任何内容,因此您无需将其保留在 UI 线程上。对于myTask()方法,它将开始在与调用者相同的线程上运行。因此,它可能取决于您之前使用 ConfigureAwait(false) 使用的许多异步调用。您必须为您的“代码”流程创建一个心理表示,并尝试在每一行上找到您将在哪个线程上。
标签: asp.net .net asynchronous webforms