Saya sudah mencoba beberapa lama untuk mendapatkan sesuatu yang saya pikir akan mudah bekerja dengan .NET 4.5
Saya ingin menjalankan dua tugas yang berjalan lama pada waktu yang sama dan mengumpulkan
hasilnya dengan cara terbaik C # 4.5 (RTM)
Berikut ini berfungsi tetapi saya tidak menyukainya karena:
- Saya ingin
Sleep
menjadi metode async sehingga bisaawait
metode lain - Itu hanya terlihat kikuk
Task.Run()
- Saya tidak berpikir ini bahkan menggunakan fitur bahasa baru sama sekali!
Kode kerja:
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;
}
Kode tidak berfungsi:
Pembaruan: Ini benar-benar berfungsi dan merupakan cara yang benar untuk melakukannya, satu-satunya masalah adalah file Thread.Sleep
Kode ini tidak berfungsi karena panggilan untuk Sleep(5000)
segera memulai tugas yang berjalan sehingga Sleep(1000)
tidak berjalan hingga selesai. Hal ini benar meskipun Sleep
adalah async
dan aku tidak menggunakan await
atau menelepon .Result
terlalu cepat.
Saya pikir mungkin ada cara untuk mendapatkan non-running Task<T>
dengan memanggil async
metode sehingga saya kemudian dapat memanggil Start()
dua tugas, tetapi saya tidak tahu bagaimana cara mendapatkan Task<T>
dari memanggil metode async.
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
bukan var task1 = Sleep(5000)
karena metode Sleep Anda tanpa menunggu kata kunci sinkron.