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
Sleep
uyumsuz bir yöntem olmak istiyorum , böyleceawait
diğ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 Sleep
da async
ve çok erken kullanmıyorum await
veya aramıyorum .Result
.
Belki de Task<T>
bir async
yö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.Result
değil var task1 = Sleep(5000)
bir bekliyoruz anahtar kelime olmadan Uyku yöntemi senkron çünkü.