2

아래 샘플에서는 비동기 "프로세스"함수가 동 기적으로 호출 될 때 "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 "";
}


  • 간단히 말해서 :task.Result"작업이 완료 될 때까지 UI를 정지시킨 다음 그 결과를 사용하는"을 의미한다.await task"내 발신자에게 수익 제어"를 의미하고; 작업이 완료되면 미래의 편리한 시간에 작업이 계속되도록 일정을 잡은 다음 결과 "를 사용합니다. - Eric Lippert

1 답변


3

첫째, 메소드는 항상 동 기적으로 호출됩니다. 언제OnLoaded이 호출되면Process방법.

그만큼Process메소드는Task.Delay메서드를 호출하고Task<string>그것이 기다리는 대상. 즉, 코드가await나중에 실행되며Process메서드는이 시점에서 반환됩니다.

그만큼OnLoaded메소드는Task<string>그것은task변하기 쉬운. 그런 다음Result작업에 대한 getter. 이렇게하면 작업이 완료 될 때까지 현재 스레드가 차단됩니다.

1 초 후,Process메소드가 계속 시도합니다. UI 스레드에서 작업을 시작했기 때문에 스케줄러는Process메서드를 UI 스레드에서 호출합니다. 그러나 UI 스레드는Resultgetter 호출, 그래서return "";명령문이 실행되지 않습니다.


  • 죄송하지만 사실이 아니므로 UI가 멈추고 " " (심지어 중단 점을 설정하고 직접보십시오). - Rohit Sharma
  • 감사합니다. 왜 나에게 클릭하지 않았는지 모르겠습니다. :) - Rohit Sharma
  • +1. 이 교착 상태를보다 자세히 설명합니다.내 블로그에MSDN 기사내 블로그 게시물에는 몇 가지 교착 상태 데모를 비롯한 추가 정보에 대한 링크가 있습니다. - Stephen Cleary

관련된 질문

최근 질문