2013-07-19 4 views
3

결과를 반환해야하는 API 이벤트가 있다고 가정합니다. 내가해야하는 계산은 컨트롤을 만드는 비동기 메서드를 사용합니다 (UI 스레드에서 실행해야 함).이벤트에 비동기 결과를 반환합니다.

private async void API_QueryControl(object sender, APIEventArgs e) 
{ 
e.Result = await CreateControl(); 
} 

private async Task<Control> CreateControl() 
{ 
await Task.Delay(1000); 
return new Panel(); 
} 

이제는 결과를 설정하기 전에 API_QueryControl이 산출하기 때문에 분명히 작동하지 않습니다. API를 제어 할 권한이 없으므로 이벤트를 변경할 수 없습니다. 결과를 기다리는 이벤트를 어떻게 얻을 수 있습니까?

+2

그렇지 않습니다. UI 스레드를 차단하거나 변경하거나 사용하지 마십시오. 값을 계산하는 더 빠른 방법을 찾으십시오. – Servy

+0

UI 스레드를 차단하여 어떻게 작동합니까? CreateControl(). Result, CreateControl(). Wait() 등으로 인해 교착 상태가 발생합니다. – user2533483

+0

이 경우 UI 스레드를 차단하는 한 가지 방법은 비동기를 사용하지 않는 것입니다. ;-) –

답변

0

ConfigureAwait(false)을 사용하여 현재 (UI) 스레드를 차단할 수 있지만 교착 상태는 피할 수 있습니다. 이처럼 - await Task.Delay 후 일부 - (false)를

e.Result = await CreateControl().ConfigureAwait(false); 

ConfigureAwait는 CreateControl에의 연속 부분을 만드는 대신 원래 UI 스레드의 스레드에서 실행됩니다.

동기식 버전의 CreateControl을 쓰는 대신 비동기를 사용해야하는 이유가 있다고 가정합니다. 그것은 단순한 코드 일뿐만 아니라 UI 스레드가 기다리는 동안 두 번째 스레드를 사용하는 대신 원래의 (UI) 스레드를 사용하여 작업을 수행합니다.

async void 방법에서 예외가 발생하지 않도록해야합니다 (수락 된 답변 here 참조).

관련 문제