Tamam, öyleyse, ikincisi kolay olanı, o yüzden halledelim.
İkinci görev için t2
, Task.Delay(1000)
sonucuyla hiçbir şey yapmazsınız. await
yapmıyorsunuz, Wait
yapmıyorsunuz, vb. Yöntemin async
olmadığı göz önünde bulundurulduğunda, bunun engelleme beklemesi olması gerektiği kanaatindeyim. Bunu yapmak için, Delay
aramasının sonuna Wait()
numaralı çağrıyı eklemek istediğinizde, engelleme beklemesi yapmak veya Thread.Sleep()
'u kullanmak istiyorsunuz. İlk görev için
, size
var
kullandığınız gerçeğiyle ısırılan ediyoruz.
Task<Task<int>> t1 = Task.Factory.StartNew(async() =>
{
await Task.Delay(2000);
return 2;
});
Sen, sadece bir Task
int
ait int
görevi bir görevi dönüyoruz: Eğer var
kullanmayın zaman neler olduğunu daha açık. İç görev tamamlandığında, dış görev "tamamlandı". WhenAll
'u kullandığınızda, dış görevin sona ermesiyle ilgilenmezsiniz, iç görevinin ne zaman biteceğini önemsersiniz. Bunu halletmenin bir kaç yolu var. Biri Unwrap
'u kullanmaktır.
Task<int> t1 = Task.Factory.StartNew(async() =>
{
await Task.Delay(2000);
return 2;
}).Unwrap();
Şimdi beklendiği gibi, en az 2000 milisaniye sürer Task<int>
ve WhenAll
bekleniyor var. Ayrıca aynı şeyi yapmak için başka await
çağrısında ekleyebilirsiniz:
başka seçenek sadece
Task.Run
yerine
StartNew
kullanmak olacaktır svick
in a comment tarafından belirtildiği gibi
Task<int> t1 = await Task.Factory.StartNew(async() =>
{
await Task.Delay(2000);
return 2;
});
.
Task<int> t1 = Task.Run(async() =>
{
await Task.Delay(2000);
return 2;
});
varsayılan seçenek olarak Task.Run
kullanmak o tercih edilir Bu nedenle size zaman uyumsuz lambdas oluştururken: Task.Run
sizin için Func<Task<T>>
alıp bir Task<T>
dönmek ve bunları otomatik paketini yöntemleri için aşırı özel bir kümesi vardır Task.Run
'u kullanamadığınız karmaşık durumlar için farkında olmanız en iyisi olsa da, sizin için bu sorunu "ele alacaktır".
Sonunda muhtemelen bu durumda yapıyor aslında olması gereken budur sen yapmadığı seçeneği, gel. Task.Delay
zaten bir Görev döndürdüğü için, ilk etapta StartNew
'a koymanıza gerek yoktur. Aksine yuvalanmış görev oluşturma ve Unwrap
kullanmaktan daha sadece ilk etapta bunu sarın edemez:
var t3 = Task.Delay(3000);
await Task.WhenAll(t1, t2, t3);
aslında sadece yapıyor olması gerekenler zamanın sabit bir tutarda beklemek istersen.
@GrantThomas Bir değişkene atamaya çalışıyorum ama bana bir derleyici hatası veriyor, bunu nasıl yapabilirim? – MuriloKunze
@MuriloKunze Bu soruyu cevaplamak için kod satırını ve hatayı görmemiz gerekiyor. – Servy
Bunu denedim: var taskresult = Task.WhenAll (t1, t2); Ama bana bir 'Yazılmış bir yerel değişkene void atanamaz' verir .. – MuriloKunze