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
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;
Ne zaman uyumsuz bir Görev<T> yö...
C senkron yöntemi zaman uyumsuz yöntem...
Eşzamanlı olarak zaman uyumsuz bir işl...
Konsolun ana yöntem zaman uyumsuz app...
Güvenli bir şekilde C zaman uyumsuz yö...