Về đoạn mã này:Tại sao async gọi lại thực hiện trong WPF thread UI
static async Task<string> testc()
{
Console.WriteLine("helo async " + Thread.CurrentThread.ManagedThreadId);
await Task.Run(() => {
Thread.Sleep(1000);
Console.WriteLine("task " + Thread.CurrentThread.ManagedThreadId);
});
Console.WriteLine("callback "+Thread.CurrentThread.ManagedThreadId);
return "bob";
}
static void Main(string[] args)
{
Console.WriteLine("helo sync " + Thread.CurrentThread.ManagedThreadId);
testc();
Console.WriteLine("over" + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(2000);
Console.ReadLine();
}
tôi nhận được kết quả như sau:
helo sync 10
helo async 10
over10
task 11
callback **11**
Đó là OK: đoạn mã sau đang chờ đợi được thực hiện trong cùng một luồng với tư cách là nhiệm vụ.
Bây giờ, nếu tôi làm điều đó trong một ứng dụng WPF:
private void Button_Click_1(object sender, RoutedEventArgs e)
{
Console.WriteLine("helo sync " + Thread.CurrentThread.ManagedThreadId);
testc();
Console.WriteLine("over" + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(2000);
Console.ReadLine();
}
nó tạo ra sau đầu ra:
helo sync 8
helo async 8
over8
task 9
callback **8**
đâu chúng ta có thể nhìn thấy mã sau khi chờ đợi thực hiện trong thread UI. Vâng, điều này là rất tốt vì nó cho phép thao tác các bộ sưu tập quan sát được ... Nhưng tôi đã tự hỏi "Tại sao?" "Làm thế nào tôi có thể làm như vậy?" Điều này có liên quan đến một số hành vi TaskScheduler không? Điều này có được mã hóa cứng trong .NET Framework không?
Thx cho bất kỳ ý tưởng nào bạn có thể gửi.
+1 cần nhấn mạnh hơn về BTW của bạn mặc dù. – Phill