Tôi đã theo dõi this question và tôi hiểu lý do đằng sau câu trả lời phổ biến (mặc dù chưa được chấp nhận) bởi Peter Duniho. Cụ thể, Tôi biết rằng không chờ một hoạt động lâu dài sau này sẽ chặn thread UI:Nên lồng ghép các hoạt động chờ đợi được chờ đợi?
Ví dụ thứ hai không mang lại trong thời gian hoạt động không đồng bộ. Thay vào đó, bằng cách lấy giá trị của thuộc tính content.Result, bạn buộc luồng hiện tại phải đợi cho đến khi thao tác không đồng bộ hoàn tất.
Tôi thậm chí đã xác nhận điều này, vì lợi ích của riêng tôi, như vậy:
private async void button1_Click(object sender, EventArgs e)
{
var value1 = await Task.Run(async() =>
{
await Task.Delay(5000);
return "Hello";
});
//NOTE: this one is not awaited...
var value2 = Task.Run(async() =>
{
await Task.Delay(5000);
return value1.Substring(0, 3);
});
System.Diagnostics.Debug.Print(value2.Result); //thus, UI freezes here after 5000 ms.
}
Nhưng bây giờ tôi đang tự hỏi: Bạn cần phải await
hoạt động tất cả các "awaitable" lồng trong một awaitable ngoài cùng hoạt động? Ví dụ, tôi có thể làm điều này:
private async void button1_Click(object sender, EventArgs e)
{
var value0 = await Task.Run(() =>
{
var value1 = new Func<Task<string>>(async() =>
{
await Task.Delay(5000);
return "hello";
}).Invoke();
var value2 = new Func<string, Task<string>>(async (string x) =>
{
await Task.Delay(5000);
return x.Substring(0, 3);
}).Invoke(value1.Result);
return value2;
});
System.Diagnostics.Debug.Print(value0);
}
Hoặc tôi có thể làm điều này:
private async void button1_Click(object sender, EventArgs e)
{
//This time the lambda is async...
var value0 = await Task.Run(async() =>
{
//we're awaiting here now...
var value1 = await new Func<Task<string>>(async() =>
{
await Task.Delay(5000);
return "hello";
}).Invoke();
//and we're awaiting here now, too...
var value2 = await new Func<string, Task<string>>(async (string x) =>
{
await Task.Delay(5000);
return x.Substring(0, 3);
}).Invoke(value1);
return value2;
});
System.Diagnostics.Debug.Print(value0);
}
Và cả hai đều không đóng băng giao diện người dùng. Cái nào là thích hợp hơn?
Tôi sẽ rất ngạc nhiên nếu những bài in điều tương tự, tôi tin rằng ai được in một đối tượng công tác thay vì kết quả của nó. –
@BenVoigt - Không, bc trong cả hai trường hợp nhiệm vụ được mở ra vì nó đang được chờ đợi. –
Nhưng một trong số đó là gói Nhiệm vụ thứ hai. –