Tôi có một Task
mà tôi đang bắt đầu và muốn chờ để hoàn thành trong một ứng dụng WPF. Bên trong nhiệm vụ này, tôi gọi một số Action
trên điều phối viên.Task.Wait vs Task.RunSyncronously nơi tác vụ đã gọi tới WPF Dispatcher.Invoke
Nếu tôi sử dụng Task.Wait()
, dường như nó treo như thể phương pháp chưa bao giờ kết thúc. Ngoài ra, các điểm ngắt bên trong Dispatcher.Invoke không bao giờ được nhấn.
Nếu tôi sử dụng Task.RunSyncronously()
, có vẻ như nó hoạt động chính xác và các điểm ngắt bên trong Bộ điều phối bị trúng.
Tại sao có sự khác biệt?
mẫu mã dưới đây:
public void ExampleMethod()
{
// When doing the following:
var task = new Task(LoadStuff);
// This never returns:
task.Start();
task.Wait();
// This version, however, does:
task.RunSyncronously();
}
private void LoadStuff()
{
ObservableCollection<StuffObj> stuff = Stuff.Load(arg1, true);
DispatchHelper.RunOnDispatcher(() =>
{
...
});
}
public static class DispatchHelper
{
public static void RunOnDispatcher(Action action)
{
Application.Current.Dispatcher.Invoke(action);
}
}
Ý của bạn là .NET 4.5, chưa có .NET 5. Ngoài ra, các phương thức không đồng bộ tạo ra một máy trạng thái thay vì sử dụng ContinueWith. –
@BrianReichle Tôi có nghĩa là C#, chứ không phải .NET, nhưng có, nó đã sai. Theo như 'async', có nó tạo ra một máy trạng thái, và máy trạng thái đó thêm chính nó như là một sự tiếp tục của nhiệm vụ đang được chờ đợi. Máy trạng thái là cơ chế theo đó nó biết cách lấy nơi nó rời đi khi tiếp tục chạy, nhưng việc thêm một sự tiếp tục vào nhiệm vụ đang chờ đợi là cách nó chạy * bất cứ thứ gì * khi 'Task' kết thúc. – Servy
Máy trạng thái lên lịch lại thông qua thiết bị chờ được trả về bởi 'GetAwaiter()', không phải 'ContinueWith' (điều này cho phép chúng ta chờ đợi những thứ khác ngoài nhiệm vụ). Cả hai đều gọi thông qua một thực thi phổ biến, nhưng 'task.GetAwaiter(). OnCompleted (...)' không gọi 'ContinueWith' (đặc biệt, trước đây tránh tạo một nhiệm vụ mới). Nhưng tôi cho rằng điều này chỉ là nhận được thông tin chi tiết, hầu hết mọi người sẽ không quan tâm đến chi tiết thực hiện :) –