Tôi đã cố gắng trong một thời gian để có được thứ mà tôi nghĩ sẽ đơn giản làm việc với .NET 4.5
Tôi muốn loại bỏ hai tác vụ đang chạy dài cùng lúc và thu thập
kết quả theo cách tốt nhất C # 4.5 (RTM)
Những điều sau đây hoạt động nhưng tôi không thích nó vì:
- Tôi muốn
Sleep
trở thành một phương thức không đồng bộ để nó có thểawait
các phương thức khác - Nó chỉ trông vụng về với
Task.Run()
- Tôi không nghĩ rằng điều này thậm chí đang sử dụng bất kỳ tính năng ngôn ngữ mới nào cả!
Mã làm việc:
public static void Go()
{
Console.WriteLine("Starting");
var task1 = Task.Run(() => Sleep(5000));
var task2 = Task.Run(() => Sleep(3000));
int totalSlept = task1.Result + task2.Result;
Console.WriteLine("Slept for a total of " + totalSlept + " ms");
}
private static int Sleep(int ms)
{
Console.WriteLine("Sleeping for " + ms);
Thread.Sleep(ms);
Console.WriteLine("Sleeping for " + ms + " FINISHED");
return ms;
}
Mã không hoạt động:
Cập nhật: Điều này thực sự hoạt động và là cách chính xác để làm điều đó, vấn đề duy nhất là Thread.Sleep
Mã này không hoạt động vì lệnh gọi Sleep(5000)
bắt đầu ngay tác vụ đang chạy nên Sleep(1000)
không chạy cho đến khi nó hoàn thành. Điều này đúng cho dù Sleep
là async
và tôi không sử dụng await
hoặc gọi điện thoại .Result
quá sớm.
Tôi nghĩ có lẽ có một cách nào đó để gỡ lỗi không chạy Task<T>
bằng cách gọi một async
phương thức để sau đó tôi có thể gọi Start()
hai tác vụ, nhưng tôi không thể tìm ra cách lấy một Task<T>
phương thức không đồng bộ.
public static void Go()
{
Console.WriteLine("Starting");
var task1 = Sleep(5000); // blocks
var task2 = Sleep(1000);
int totalSlept = task1.Result + task2.Result;
Console.WriteLine("Slept for " + totalSlept + " ms");
}
private static async Task<int> Sleep(int ms)
{
Console.WriteLine("Sleeping for " + ms);
Thread.Sleep(ms);
return ms;
}
task1.Result
không phải var task1 = Sleep(5000)
vì phương pháp Sleep của bạn không có từ khóa await là đồng bộ.