내 C # / XAML 메트로 앱에는 장기 실행 프로세스를 시작하는 버튼이 있습니다. 따라서 권장대로 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;
설문 조사는 분명히 끔찍합니다 (바쁨 대기 / 사이클 낭비). 나는 이벤트 기반의 것을 찾고 있습니다.
어떤 아이디어?
이 단순화 된 예제에서 Btw는 GetResults ()를 두 부분으로 나누고 시작 단추에서 첫 번째 부분을 계속 단추에서 두 번째 부분을 호출하는 솔루션입니다. 실제로 GetResults에서 발생하는 작업은 더 복잡하며 실행 내 다른 지점에서 다른 유형의 사용자 입력이 필요할 수 있습니다. 따라서 논리를 여러 방법으로 나누는 것은 쉽지 않습니다.
ManualResetEvent(Slim)
는 지원하지 않는 것 같습니다WaitAsync()
.