私のC#/ XAML Metroアプリには、長時間実行プロセスを開始するボタンがあります。したがって、推奨されるように、UIスレッドがブロックされないようにするためにasync / awaitを使用しています。
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)
...
}
場合によっては、GetResults内で発生する処理が続行する前に、追加のユーザー入力が必要になります。簡単にするために、ユーザーが「続行」ボタンをクリックする必要があるとしましょう。
私の質問は、別のボタンのクリックなどのイベントを待機するようにGetResultsの実行を一時停止するにはどうすればよいですか?
ここに私が探しているものを達成するための醜い方法があります:続行するためのイベントハンドラー」ボタンはフラグを設定します...
private bool _continue = false;
private void buttonContinue_Click(object sender, RoutedEventArgs e)
{
_continue = true;
}
...そしてGetResultsは定期的にそれをポーリングします:
buttonContinue.Visibility = Visibility.Visible;
while (!_continue) await Task.Delay(100); // poll _continue every 100ms
buttonContinue.Visibility = Visibility.Collapsed;
ポーリングは明らかにひどい(ビジー待機/サイクルの無駄)ので、イベントベースの何かを探しています。
何か案は?
ところで、この単純化された例では、1つの解決策はもちろんGetResults()を2つの部分に分割し、最初の部分を開始ボタンから呼び出し、2番目の部分を続行ボタンから呼び出すことです。実際には、GetResultsで発生するものはより複雑で、実行中のさまざまなポイントでさまざまなタイプのユーザー入力が必要になる可能性があります。したがって、ロジックを複数のメソッドに分割することは簡単ではありません。
ManualResetEvent(Slim)
はをサポートしていないようですWaitAsync()
。