Bu hatayı alıyorsunuz çünkü Tasksınıf görevi size vermeden önce zaten başlattı. Yalnızca Startkurucusunu çağırarak oluşturduğunuz bir görevi çağırmalısınız ve görevi oluştururken başlatmamak için ikna edici bir nedeniniz yoksa bunu bile yapmamalısınız; hemen başlamasını istiyorsanız, Task.Runya da Task.Factory.StartNewyeni bir tane oluşturmak ve başlatmak için kullanmalısınız Task.
Artık o sinir bozucudan kurtulmamız gerektiğini biliyoruz Start. Kodunuzu çalıştırırsınız ve mesaj kutusunun 5 saniye sonra değil, hemen gösterildiğini görürsünüz, bunda ne var?
Eh, Task.Delaysadece seni 5 saniye içinde tamamlanacak bir görevi verir. İş parçacığının yürütülmesini 5 saniye durdurmaz. Yapmak istediğiniz şey, bu görev bittikten sonra çalıştırılan bir koda sahip olmaktır. Bunun ContinueWithiçin. Belirli bir görev tamamlandıktan sonra bazı kodları çalıştırmanıza izin verir:
public void FunctionA()
{
Task.Delay(5000)
.ContinueWith(t =>
{
MessageBox.Show("Waiting Complete");
});
}
Bu beklendiği gibi davranacaktır.
awaitDevamları daha kolay eklemek için C # 5.0'ın anahtar kelimesini de kullanabiliriz :
public async Task FunctionA()
{
await Task.Delay(5000);
MessageBox.Show("Waiting Complete");
}
Burada neler olup bittiğine dair tam bir açıklama bu sorunun kapsamı dışındayken, sonuç, önceki yönteme çok benzer davranan bir yöntemdir; yöntemi çağırdıktan 5 saniye sonra bir mesaj kutusu gösterecek, ancak her iki durumda da yöntemin kendisi [neredeyse] hemen dönecektir. Bununla birlikte await, çok güçlüdür ve basit ve anlaşılır görünen yöntemler yazmamıza izin verir, ancak bunu ContinueWithdoğrudan kullanarak yazmak çok daha zor ve daha karmaşık olur . Ayrıca, çok sayıda standart kod çıkararak, hata işlemeyi büyük ölçüde basitleştirir.
Wait()Bir göreve çağrı yapmak , görev çözülene kadar mevcut iş parçacığını engeller. Neredeyse asla olmasını istediğiniz şey bu değil.