다음과 같은 코드가 있다고 가정합니다.
...
var task1 = DoWorkAsync(1);
var task2 = DoWorkAsync(2);
await Task.WhenAll(task1, task2);
...
private async Task DoWorkAsync(int n)
{
// Async HTTP request that we ConfigureAwait(to be determined).
// Some CPU-bound work that isn't thread-safe.
}
그래서 내가 WPF 앱 ConfigureAwait(false)
에 있고 HTTP 요청에 있지 않다면 여기서 안전합니까? 두 HTTP 요청을 동시에 만들 수 있지만 작업은 UI 스레드에서 다시 시작해야하므로 CPU 바인딩 작업이 다중 스레드가 아닙니다. 그러나 그렇게 ConfigureAwait(false)
하면 작업이 다른 스레드 풀 스레드에서 병렬로 CPU 바운드 작업을 다시 시작할 수 있으므로 문제가 있습니까?
내가 ASP.NET에 있다면 동기화 컨텍스트가 WPF와 같은 스레드와 관련이 없기 때문에 어느 쪽이든 발생할 수 있습니까?
콘솔 앱을 사용하면 어떻게 되나요?
어떻게 이야기 DoWorkAsync
합니까? ' DoWorkAsync
동시에하는 것은 안전하지 않다'고 말 합니까?
재 설계하는 일반적인 방법이 있습니까? 동시에 수행해야 할 중요한 부분은 CPU 바운드 작업이 아닌 HTTP 요청입니다. 그래서 잠금이나 다른 것을 사용합니까 (이전에 사용한 적이 없음)?
따라서 WPF 앱에 있고 HTTP 요청에 대해 ConfigureAwait (false)를 사용하지 않는 경우 여기에서 안전합니까?
이것이 UI 스레드에서 호출되면 예, 맞습니다. UI 컨텍스트는 한 번에 하나의 스레드 만 허용하므로 (특정 UI 스레드) CPU 바인딩 부분은 UI 스레드에서 실행되며 서로 간섭하지 않습니다. 이것은 매우 일반적인 속임수입니다.
ConfigureAwait (false)를 수행하면 작업이 다른 스레드 풀 스레드에서 병렬로 CPU 바운드 작업을 재개 할 수 있으므로 문제가 발생합니까?
예. 왜냐하면 ConfigureAwait(false)
"CPU 바운드 작업에는 컨텍스트가 필요하지 않습니다"를 의미하므로 스레드 풀에서 병렬로 실행할 수 있습니다.
ASP.NET에있는 경우
클래식 ASP.NET에는 한 번에 하나의 스레드 요청 컨텍스트가 있으므로 동일하게 작동합니다. 없는 경우 안전합니다 ConfigureAwait(false)
.
ASP.NET Core에는 요청 컨텍스트 가 없으므로 ( SynchronizationContext
어쨌든은 아님) 해당 플랫폼에서 병렬로 실행할 수 있습니다. ASP.NET Core SynchronziationContext에 대한 블로그 게시물에서 이것을 "암시 적 병렬 처리"라고합니다 .
콘솔 앱을 사용하면 어떻게 되나요?
컨텍스트가 없으므로 병렬로 실행할 수 있습니다.
DoWorkAsync에 대해 어떻게 이야기합니까?
"이 방법은 비 자유 스레드가 필요합니다 SynchronizationContext
."
자물쇠 같은 걸 사용하나요
이것이 최선의 접근 방식입니다. 예 :
private readonly object _mutex = new object();
private async Task DoWorkAsync(int n)
{
await HttpRequestAsync().ConfigureAwait(false);
lock (_mutex)
{
// Some CPU-bound work that isn't thread-safe.
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다