【问题标题】:Making UI changes after calling ConfigureAwait(false) in a webform project在 webform 项目中调用 ConfigureAwait(false) 后进行 UI 更改
【发布时间】: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


【解决方案1】:

我试过了,效果很好。不知道有没有其他问题。

一些 ASP.NET API 在它们的 SynchronizationContext 之外可以正常工作,而其他的则不能。他们是否需要它是无证的。我相信那些没有SynchronizationContext 的工作只是碰巧没有它工作;我不相信它们是在设计时考虑到该用例的。另一个考虑因素是 ASP.NET SynchronizationContext 确保一次只运行一个线程,因此它会同步对所有 WebForms 对象的访问。

由于这些原因,我总是在调用任何 ASP.NET API 之前在 ASP.NET 上下文中恢复。这包括设置 WebForms 属性。所以我不会在这里使用ConfigureAwait(false)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    相关资源
    最近更新 更多