SORU
9 Ocak 2013, ÇARŞAMBA


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
1 Mart 2013, Cuma


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Charles Renaud

    Charles Rena

    10 Kasım 2007
  • RocketJump

    RocketJump

    22 ŞUBAT 2006
  • SegaAmerica

    SegaAmerica

    5 Mart 2008