Tôi nghĩ rằng tôi đã hiểu mô hình chờ đồng bộ và Task.Runhoạt động.
Nhưng tôi tự hỏi tại sao trong ví dụ mã sau đây awaitkhông đồng bộ trở lại luồng UI sau khi trở về từ tác vụ đã hoàn thành.
public async Task InitializeAsync()
{
Console.WriteLine($"Thread: {Thread.CurrentThread.ManagedThreadId}"); // "Thread: 1"
double value = await Task.Run(() =>
{
Console.WriteLine($"Thread: {Thread.CurrentThread.ManagedThreadId}"); // Thread: 6
// Do some CPU expensive stuff
double x = 42;
for (int i = 0; i < 100000000; i++)
{
x += i - Math.PI;
}
return x;
}).ConfigureAwait(true);
Console.WriteLine($"Result: {value}");
Console.WriteLine($"Thread: {Thread.CurrentThread.ManagedThreadId}"); // Thread: 6 - WHY??
}
Mã này chạy trong ứng dụng .NET Framework WPF trên hệ thống Windows 10 với Trình gỡ lỗi Visual Studio 2019 đính kèm.
Tôi đang gọi mã này từ nhà xây dựng của Applớp tôi .
public App()
{
this.InitializeAsync().ConfigureAwait(true);
}
Có thể đó không phải là cách tốt nhất, nhưng tôi không chắc đây có phải là lý do cho hành vi kỳ lạ đó không.
Mã bắt đầu với luồng UI và sẽ thực hiện một số tác vụ. Với awaitthao tác và ConfigureAwait(true)sau khi Nhiệm vụ kết thúc, nó sẽ tiếp tục trên Chủ đề chính (1). Nhưng nó không.
Tại sao?