Böyle bazı yavaş çalışır bir görev oluşturur bazı kodlar vardır:Bekleme çağrıldığında, eşzamanlı sürümle aynı davranan gövde içinde bekleyen bir Görev nasıl oluşturulur?
public static Task wait1()
{
return new Task(() =>
{
Console.WriteLine("Waiting...");
Thread.Sleep(10000);
Console.WriteLine("Done!");
});
}
gerçek uygulamada, Thread.Sleep aslında bir web hizmeti çağrı olur. Yöntemin gövdesini beklemek için kullanabilirim (böylece ağ erişimi/uyku sırasında bir iplik tüketmez). Benim ilk girişimi bu oldu (av tüfeği-ayıklama derleme hataları dayanarak):
public static Task wait2()
{
return new Task(async() =>
{
Console.WriteLine("Waiting...");
await Task.Delay(10000);
Console.WriteLine("Done!");
});
}
Ancak; Bu görev ilkininkiyle aynı gibi görünmüyor, çünkü .Wait() 'i çağırdığımda; hemen döner.
Aşağıda, farklılıkları gösteren tam bir örnek (konsol uygulaması) bulunmaktadır (uygulama, ikinci görev başladığında hemen sona erecektir).
İçinde beklemede olan bir kodun bulunması gereken bir Görevde Bekle ve Bekle'yi çağırabilmem için ne yapmam gerekiyor? Görevler daha sonra bir aracı tarafından sıraya konur ve yürütülür, bu nedenle görevin otomatik olarak başlatılmaması önemlidir.
class Program
{
static void Main(string[] args)
{
var w1 = wait1();
w1.Start();
w1.Wait(); // This waits 110 seconds
var w2 = wait2();
w2.Start();
w2.Wait(); // This returns immediately
}
public static Task wait1()
{
return new Task(() =>
{
Console.WriteLine("Waiting...");
Thread.Sleep(10000);
Console.WriteLine("Done!");
});
}
public static Task wait2()
{
return new Task(async() =>
{
Console.WriteLine("Waiting...");
await Task.Delay(10000);
Console.WriteLine("Done!");
});
}
}
Neden yeni bir görev yapalım? Neden dış yöntemi 'eşzamansız 'yapmaz ve' Görev 'i otomatik olarak döndürür? Yani, statik async Görev bekle3() {Console.WriteLine ("..."); Task.Delay (10000) bekliyor; Console.WriteLine ("..."); } ' –
@EricLippert Bunu denedim; ama farklı davranıyor gibi görünüyor ... 'Calling' .Start() 'System.InvalidOperationException atar: Start, söz stili tarzında bir görev çağrılmayabilir. Görevlerim daha sonra çağrılacak bir sıraya giriyor; bu yüzden onları daha sonra başlatabilirim. –
Amacınız, Start çağrılıncaya kadar beklemekte beklemekte beklemekte? Bunu, "Daha sonra Başlat'ı arayabilmem gerekiyor." Eğer durum buysa, sanırım soru, beklediğiniz yürütme ile güncellenmelidir. –