Başlangıç söz tarzı bir görev çağrılabilir. istisna geliyor
Basit bir wpf masaüstü uygulaması oluşturma ediyorum. UI sadece bir düğme var ve kod .cs gibi dosya.
private void Button_Click_2(object sender, RoutedEventArgs e)
{
FunctionA();
}
public void FunctionA()
{
Task.Delay(5000).Start();
MessageBox.Show("Waiting Complete");
}
Ancak şaşırtıcı bir şekilde Task.Delay(5000).Start();
bir özel durum üretiliyor. "InvalidOperationException
. "Başlat söz tarzı bir görev çağrılabilir. Herhangi bir bu neden yardımcı olabilir misiniz?
CEVAP
Task
sınıf zaten onu sana vermeden önce göreve başladığı için bu hata alınıyor. Size gereken sadece çağrı Start
Bir görevi oluşturduğunuz çağırarak değil yapıcı ve olmamalı buna sahip değilsen zorlayıcı bir sebep değil Başlat görev oluşturduğunuzda, isterseniz başladı hemen kullanmalısın Task.Run
Task.Factory.StartNew
Her iki oluşturmak ve yeni bir başlangıç Task
.
Yani sen şimdi bu sinir bozucu kurtulmak biliyoruz Start
. Kodunuzu çalıştırın ve bir ileti kutusu hemen gösterilen, 5 saniye geç bulacak, ne oldu o iş?
İyi Task.Delay
sadece 5 saniye içinde tamamlanacak bir görev verir. 5 saniye için iş parçacığı yürütme durmuyor. Yapmak istediğin bu görev tamamlandıktan sonra yürütülen bir kod var. ContinueWith
. Verilen bir görevi bittikten sonra bazı kod çalıştırmanızı sağlar.:
public void FunctionA()
{
Task.Delay(5000)
.ContinueWith(t =>
{
MessageBox.Show("Waiting Complete");
});
}
Bu beklendiği gibi davranır.
Ayrıca kaldıraç C# 5.0 await
bu anahtar sözcük devamı daha kolay ekleyebilirsiniz:
public async Task FunctionA()
{
await Task.Delay(5000);
MessageBox.Show("Waiting Complete");
}
Tam açıklama burada neler ötesinde kapsam bu soru, sonuç, bir yöntem davranır çok benzer önceki yöntem; Haritayı mesaj kutusu 5 saniye sonra dediğiniz yöntemi ama bu yöntemi kendisi dönecektir [neredeyse] hemen her iki durumda. O dedi, await
çok güçlü ve bize basit ve anlaşılır gibi yöntemler yazmak, ama yazmak çok daha zor ve messier doğrudan ContinueWith
kullanarak olacaktır. Bu da büyük ölçüde, hata işleme ile ilgili, demirbaş kodu bir sürü yaptırmayı kolaylaştırıyor.
Sunucu <--yük başlangıç> değer n...
Karakter seti ve harmanlama tam olarak...
've ben bir istisna yakalandı!! Ş...
Nasıl Gmail filtre metin arama oluştur...
Clojure Huzurlu bir web hizmeti gelişt...