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
Sleepmenjadi metode async sehingga bisaawaitmetode 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 Sleepadalah asyncdan aku tidak menggunakan awaitatau menelepon .Resultterlalu cepat.
Saya pikir mungkin ada cara untuk mendapatkan non-running Task<T>dengan memanggil asyncmetode 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.Resultbukan var task1 = Sleep(5000)karena metode Sleep Anda tanpa menunggu kata kunci sinkron.