아래 샘플에서는 비동기 "프로세스"함수가 동 기적으로 호출 될 때 "await Task.Delay (1000)"호출이 UI를 정지시키는 것을 볼 수 있습니다.
나는 "await Task.Delay (1000) .ConfigureAwait (false)"를 호출하거나 "Process"호출을 다른 태스크 안에 랩핑함으로써 중단을 피할 수 있다는 것을 알고있다. 나는 문제가 synchornizationcontext와 함께 있다는 것을 이해할 수있다. 그리고 나는 그것이 "Task.Delay (1000) .Wait ()"UI에 "TaskDelay (1000)"호출을 " 멈추지 않아.
누군가가 그 행동을 설명해 주시겠습니까 (나는 ildasm 코드를 보았지만 도움이되지 않았습니다). 감사합니다.
public MainWindow()
{
InitializeComponent();
Loaded += OnLoaded;
}
public async void OnLoaded(object sender, RoutedEventArgs args)
{
var task = Process();
MessageBox.Show(task.Result);
}
public async Task<String> Process()
{
await Task.Delay(1000);
return "";
}
첫째, 메소드는 항상 동 기적으로 호출됩니다. 언제OnLoaded
이 호출되면Process
방법.
그만큼Process
메소드는Task.Delay
메서드를 호출하고Task<string>
그것이 기다리는 대상. 즉, 코드가await
나중에 실행되며Process
메서드는이 시점에서 반환됩니다.
그만큼OnLoaded
메소드는Task<string>
그것은task
변하기 쉬운. 그런 다음Result
작업에 대한 getter. 이렇게하면 작업이 완료 될 때까지 현재 스레드가 차단됩니다.
1 초 후,Process
메소드가 계속 시도합니다. UI 스레드에서 작업을 시작했기 때문에 스케줄러는Process
메서드를 UI 스레드에서 호출합니다. 그러나 UI 스레드는Result
getter 호출, 그래서return "";
명령문이 실행되지 않습니다.
task.Result
"작업이 완료 될 때까지 UI를 정지시킨 다음 그 결과를 사용하는"을 의미한다.await task
"내 발신자에게 수익 제어"를 의미하고; 작업이 완료되면 미래의 편리한 시간에 작업이 계속되도록 일정을 잡은 다음 결과 "를 사용합니다. - Eric Lippert