Tôi nghĩ rằng tôi đã hiểu mô hình chờ đồng bộ và Task.Run
hoạt động.
Nhưng tôi tự hỏi tại sao trong ví dụ mã sau đây await
khô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 App
lớ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 await
thao 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?