2016-12-12 5 views
0

SynchronizationContext.Current가 null 일 때 Task.Wait() 및 Task.Result를 호출하는 것이 100 % 안전하지 않은 이유는 무엇입니까?SynchronizationContext.Current가 null 인 경우 Task.Wait를 안전하게 사용할 수 있습니까?

필자는 멀티 스레드이지만 동기식 서비스를 제공합니다. 동기 메서드 중 하나를 HttpClient.PostAsXmlAsync에 대한 호출로 대체하려고합니다. 구현은 전체 프로젝트 변경을 피하기 위해 .Result를 사용하여 동기 메소드로 변환합니다. 그러나 잘 설명되어있는 일반적인 교착 상태 문제가 발생합니다.

동기화 컨텍스트가없는 경우 교착 상태가 발생할 수 있음을 이해하지 못합니다.

+0

어쩌면 적어도 일부 코드를 게시 할 수 있습니다. 서비스로 당신은 Windows 서비스를 의미합니까? – Evk

+0

@Evk - 그는 아마도 웹 서비스를 의미합니다. – Zegar

+0

비동기 메소드를 처음 사용하는 이유는 무엇입니까? 동기 연산을 수행하려면 처음부터 본질적으로 동기식 메소드 만 사용하십시오. 어쨌든 그냥 기다려야하는 경우 비동기 메소드 몇 개를 만드는 목적은 없습니다. 둘 중 하나를 사용하거나 서비스 핸들러를 비동기로 만들면됩니다. – Servy

답변

-1

방법 HttpClient.PostAsXmlAsync은 백그라운드에서 HttpClient.SendAsync을 실행하는 확장 방법입니다. SendAsync 메서드는 비동기 메서드입니다.
"동기식"방식으로 비동기식 메서드를 호출하면 혼자서 알아 차린 것처럼 매우 잘 문서화 된 교착 상태가 발생합니다.

은 ...

async에 전체 응용 프로그램 파이프 라인을 변경하는 것을 방지하려면 전체 프로젝트를 변경하는 것을 방지하기 위해, 동기 방법으로 그것을 변환 - async를 사용하지 마십시오.
async-await

+0

"동기화 컨텍스트를 만드는 방법"이란 무엇입니까? 나는 부름이 문맥을 포착한다고 믿는다. SendAsync를 인식하지 못하거나 동기화 컨텍스트를 만들 것을 기다리고 있습니다. –

0

더 동기화 컨텍스트가없는 경우, 비동기 코드에 typical problems with blocking가 발생하지 않습니다 그것을 :) 사용 시작하면 모든 응용 프로그램에 걸쳐 좀비 바이러스입니다. 그러나 100 % 안전하지는 않습니다. 스레드가 스레드 풀에 속하면 블로킹이 스레드가 풀로 돌아가는 것을 차단하여 스레드 풀 스레드가 부족해질 수 있습니다.

필자의 경우이 문제는 실제로 회사 프록시 서버로 인해 발생했습니다. 충분한 시간이 주어지면 실이 정말로 돌아올 것입니다. HttpClient에 HttpClientHandler를 전달하고 UseProxy = false로 코드를 변경하여 문제가 사라졌습니다.