Bir süredir .NET 4.5 ile çalışmanın basit olacağını düşündüğüm bir şeyi elde etmeye çalışıyorum.
İki uzun süreli görevi aynı anda başlatmak ve
sonuçları en iyi C # 4.5 (RTM) yöntemiyle toplamak istiyorum.
Aşağıdakiler çalışıyor ama hoşuma gitmiyor çünkü:
- Zaman
Sleepuyumsuz bir yöntem olmak istiyorum , böyleceawaitdiğer yöntemler olabilir - Sadece beceriksiz görünüyor
Task.Run() - Bunun herhangi bir yeni dil özelliğini kullandığını bile düşünmüyorum!
Çalışma kodu:
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;
}
Çalışmayan kod:
Güncelleme: Bu aslında işe yarıyor ve bunu yapmanın doğru yolu, tek sorun Thread.Sleep
Bu kod çalışmaz çünkü Sleep(5000)görevi hemen çalıştırma çağrısı Sleep(1000), tamamlanana kadar çalışmaz. Bu doğru olsa Sleepda asyncve çok erken kullanmıyorum awaitveya aramıyorum .Result.
Belki de Task<T>bir asyncyöntemi çağırarak çalışmayan bir çalışma yapmanın bir yolu olduğunu düşündüm, böylece daha sonra Start()iki görevi arayabilirim , ancak zaman Task<T>uyumsuz bir yöntemi çağırmaktan nasıl bir sonuç alacağımı bulamıyorum.
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.Resultdeğil var task1 = Sleep(5000)bir bekliyoruz anahtar kelime olmadan Uyku yöntemi senkron çünkü.