왜 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_Click
UI 컨텍스트에서 시작되어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가 기본값입니다.
'Programing' 카테고리의 다른 글
카산드라 : 텍스트 대 varchar (0) | 2020.12.31 |
---|---|
한 커밋이 다른 커밋의 조상인지 (또는 그 반대의 경우) 어떻게 알 수 있습니까? (0) | 2020.12.31 |
Firebase Analytics 맞춤 이벤트 매개 변수 (0) | 2020.12.31 |
Maven에서 단일 테스트 만 건너 뛰는 방법이 있습니까? (0) | 2020.12.31 |
SQL Server는 중복 키 업데이트시 MySQL과 같은 것을 제공합니까? (0) | 2020.12.31 |