Programing

왜 Task.ConfigureAwait (continueOnCapturedContext : false);

lottogame 2020. 12. 31. 07:52
반응형

왜 Task.ConfigureAwait (continueOnCapturedContext : false);


Windows 양식의 다음 코드를 고려하십시오.

private async void UpdateUIControlClicked(object sender, EventArgs e)
    {
        this.txtUIControl.Text = "I will be updated after 2nd await - i hope!";
        await Task.Delay(5000).ConfigureAwait(continueOnCapturedContext: false);
        this.txtUIControl.Text = "I am updated now.";
    }

await 후에 코드가 UI가 아닌 스레드에서 실행되기 때문에 예외가 세 번째 줄에서 발생합니다. ConfigureAwait (false)가 유용한 곳은 어디입니까?


Stephen Cleary는 여기 에서 찾을 수있는 이것에 대해 정말 좋은 시리즈를 가지고 있습니다 . 저는 귀하의 질문에 맞는 글을 인용했습니다.

대부분의 경우 "기본"컨텍스트로 다시 동기화 할 필요 가 없습니다 . 대부분의 비동기 메서드는 구성을 염두에두고 설계됩니다. 다른 작업을 기다리고 있으며 각 메서드는 다른 작업에 의해 구성 될 수있는 비동기 작업 자체를 나타냅니다. 이 경우에, 당신은 할 수 awaiter을 말하고 싶어 하지 를 호출 해, 현재의 상황을 캡처 ConfigureAwait을 하고 통과 false예 :

private async Task DownloadFileAsync(string fileName)
{
  // Use HttpClient or whatever to download the file contents.
  var fileContents = await DownloadFileContentsAsync(fileName).ConfigureAwait(false);

  // Note that because of the ConfigureAwait(false), we are not on the original context here.
  // Instead, we're running on the thread pool.

  // Write the file contents out to a disk file.
  await WriteToDiskAsync(fileName, fileContents).ConfigureAwait(false);

  // The second call to ConfigureAwait(false) is not *required*, but it is Good Practice.
}

// WinForms example (it works exactly the same for WPF).
private async void DownloadFileButton_Click(object sender, EventArgs e)
{
  // Since we asynchronously wait, the UI thread is not blocked by the file download.
  await DownloadFileAsync(fileNameTextBox.Text);

  // Since we resume on the UI context, we can directly access UI elements.
  resultTextBox.Text = "File downloaded!";
}

이 예제에서 주목해야 할 중요한 점은 비동기 메서드 호출의 각 "수준"에 자체 컨텍스트가 있다는 것입니다. DownloadFileButton_ClickUI 컨텍스트에서 시작되어 DownloadFileAsync. DownloadFileAsync또한 UI 컨텍스트에서 시작되었지만을 호출하여 컨텍스트에서 나갔습니다 ConfigureAwait(false). 나머지 DownloadFileAsync실행은 스레드 풀 컨텍스트에서 수행됩니다. 그러나, DownloadFileAsync완료 및 DownloadFileButton_CLICK 이력서, 그것은 수행 하는 UI 맥락에서 이력서를.

좋은 경험 법칙은 컨텍스트 필요 ConfigureAwait(false)하지 않은 경우 사용 하는 것입니다.


서비스는 UI와 무관해야하므로 서비스에서 항상 사용해야합니다.

그러나 다음과 같은 경우 서비스 외부에서 사용하지 마십시오.

  • UI를 조작하거나 Dispatcher 또는 CoreDispatcher와 같은 UI 특정 구성 요소를 사용해야합니다.
  • ASP.net에서 HttpClient.Current를 사용해야합니다.

이 경우 ConfigureAwait(false)현재 컨텍스트를 캡처하는 것이 중요하므로 사용하지 않아야합니다. 그렇지 않으면 UI가 아닌 스레드에서 UI보기에 액세스하려고 할 때 앱이 충돌합니다.

당신이 쓸 때 await task;, 그것은 await를 쓰는 것과 같습니다 task.ConfigureAwait(true);. 따라서 true가 기본값입니다.

참조 URL : https://stackoverflow.com/questions/27851073/why-would-i-bother-to-use-task-configureawaitcontinueoncapturedcontext-false

반응형