我们都知道 await 会让当前线程释放回线程池,然后 await后再申请,在默认情况下一放 一申请 这两未必是同一个线程了。
但是我们在写WPF/winform时,如果如下
private async void Button_Click(object sender, RoutedEventArgs e)
{// UI 线程myButton.Content = "开始";await Task.Delay(1000); // 这里会挂起,线程可能切换// 恢复回来时依然是 UI 线程(默认行为)myButton.Content = "完成";
}
会发现,后面的UI操作 myButton.Content = 依然可以正常 ,他依然前后是在同一个UI线程中。
这里不得不记录一下了
在 C# 的 async/await 机制里
- await 之前的代码运行在哪个线程,取决于你是在哪个上下文调用的(比如 WPF 中就是 UI 线程)
- await 的时候,当前方法会“挂起”,然后把控制权返回给调用者。
- await 之后继续执行时,是否还在原线程,取决于 SynchronizationContext(同步上下文)。
WPF 的情况