SORU
12 EKİM 2012, Cuma


Başka bir zaman uyumsuz yöntem yerine bir olay beklemek mümkün mü?

#/C XAML metro uygulamam, uzun süren bir süreç başladı bir düğme var. Tavsiye olarak, zaman uyumsuz/UI iş parçacığı bloke olmadığından emin olmak için bekliyor kullanıyorum:

private async void Button_Click_1(object sender, RoutedEventArgs e) 
{
     await GetResults();
}

private async Task GetResults()
{ 
     // Do lot of complex stuff that takes a long time
     // (e.g. contact some web services)
  ...
}

Bazen, bir şeyler GetResults içinde olmaya devam edebilmesi için ek kullanıcı girdisi gerektirir. Basitlik için, Kullanıcı sadece tıklayın "" butonuna basın. devam var demek

Benim sorum:nasıl bir şey bekliyor böyle bir şekilde GetResults yürütülmesini askıya alabilir miyimolaybaşka bir düğmeyi tıklayarak gibi?

İşte aradığım şeyi elde etmek için hoş bir yöntem: olay" düğmesine bir bayrak ayarlar... . devam işleyicisi

private bool _continue = false;
private void buttonContinue_Click(object sender, RoutedEventArgs e)
{
    _continue = true;
}

... ve GetResults periyodik olarak yoklar:

 buttonContinue.Visibility = Visibility.Visible;
 while (!_continue) await Task.Delay(100);  // poll _continue every 100ms
 buttonContinue.Visibility = Visibility.Collapsed;

Yoklama açıkça korkunç (meşgul bekleme döngüsü atık/) ve bir olay tabanlı arıyorum.

Herhangi bir fikir?

Bu basitleştirilmiş örnekte Btw, bir çözüm elbette GetResults ayırmak olacaktır() iki parçaya, Başlat düğmesinden ilk bölümü ve ikinci bölümü düğmesi devam çağırır. Gerçekte, malzeme GetResults oluyor daha karmaşık ve kullanıcı giriş farklı yürütme içinde farklı noktalarda gerekli olabilir. Yani birden fazla yöntem içine mantık ayrılıyor önemsiz olacaktır.

CEVAP
12 EKİM 2012, Cuma


Bir sinyal olarak SemaphoreSlim Class örneği kullanabilirsiniz:

private SemaphoreSlim signal = new SemaphoreSlim(0, 1);

// set signal in event
signal.Release();

// wait for signal somewhere else
await signal.WaitAsync();

Alternatif olarak, düğme tıklama sonucu gösteren Task<T> oluşturmak için TaskCompletionSource<T> Class bu örneği kullanabilirsiniz:

private TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();

// complete task in event
tcs.SetResult(true);

// wait for task somewhere else
await tcs.Task;

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Abe Olandres

    Abe Olandres

    16 EYLÜL 2006
  • Fubar Protocol

    Fubar Protoc

    21 AĞUSTOS 2010
  • KoreanFrogMania님의 채널

    KoreanFrogMa

    18 Aralık 2011