이것은 WPF.NET에서 직면 한 질문입니다.WPF에서 ManualResetEvent 및 비동기 메서드를 사용할 때 교착 상태가 발생하는 이유는 무엇입니까?
public class TaskRunnerWithProgressFeedback(){
ManualResetEvent _event = new ManualResetEvent(false);
public void RunTask(Action action) {
_event.Reset();
//Display loading screen
RunAsync(action);
Console.WriteLine("Load completed.");
//Hide loading screen
_event.WaitOne();
}
private async void RunAsync(Action action) {
await Task.Run(() => action.Invoke());
_event.Set();
}
}
그래서 내가 여기에이 클래스를 가지고 있고, 나는 UI 스레드에서 RunTask
메소드를 호출 : 문제를 설명하기 위해, 우리는 아래의 클래스를 살펴 봅시다. 예를 들어 :
private void Button1_OnClick(object sender , RoutedEventArgs e) {
var x = new TaskRunnerWithProgressFeedback();
x.RunTask(()=>{ /*Some time-consuming action*/ });
}
그리고 Button1을 클릭하면, 전체 프로그램이 교착 상황으로 실행됩니다. 이 상황에 대한 설명이 있습니까?
발 참고 사항 : 행동 테스트를 수행하려면 TaskRunnerWithProgressFeedback
클래스가 필요합니다. 나는 그 테스트를 깨기 때문에 BackgroundWorker
을 사용하지 않을 것이다.
WaitOne()은 어디에 있나요? – Sinatr
'await'없이'async' 메소드를 호출하지 마십시오. 그리고 이벤트 핸들러를 제외한 다른 곳에서는'async void' 메소드를 사용하지 마십시오. – dymanoid
죄송합니다. 사고였습니다. 다시 추가했습니다. –