C # / XAML metro uygulamamda, uzun süren bir işlemi başlatan bir düğme var. Bu nedenle, önerildiği gibi, UI iş parçacığının engellenmediğinden emin olmak için async / await 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, GetResults içinde gerçekleşen şeyler devam edebilmek için ek kullanıcı girişi gerektirir. Basitlik açısından, kullanıcının "devam" düğmesini tıklaması gerektiğini varsayalım.
Benim sorum: GetResults'un yürütülmesini , başka bir düğmeyi tıklamak gibi bir etkinliği bekleyecek şekilde nasıl askıya alabilirim ?
İşte aradığım şeyi elde etmek için çirkin bir yol: Devam et için olay işleyici "düğmesi bir bayrak ayarlar ...
private bool _continue = false;
private void buttonContinue_Click(object sender, RoutedEventArgs e)
{
_continue = true;
}
... ve GetResults belirli aralıklarla 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ü israf) ve ben olay tabanlı bir şey arıyorum.
Herhangi bir fikir?
Bu basitleştirilmiş örnekte, bir çözüm elbette GetResults'u () iki parçaya bölmek, ilk düğmeyi başlat düğmesinden ve ikinci parçayı devam düğmesinden çağırmak olacaktır. Gerçekte, GetResults'ta gerçekleşen şeyler daha karmaşıktır ve yürütme içindeki farklı noktalarda farklı kullanıcı girişi türleri gerekebilir. Bu nedenle, mantığı birden çok yönteme ayırmak önemsiz olacaktır.
ManualResetEvent(Slim)
desteklemiyor gibi görünüyorWaitAsync()
.