2012-09-19 2 views
2

어디에서 잘못 될지 알려주는 지 궁금합니다. 내 wpf 응용 프로그램에 서비스 참조를 추가했습니다. VS2012WCF 비동기 작업이 실제로 비동기가 아님

그러나 비동기 호출에 대한 대기 시간이 막히고 있습니다. 지금은 아무 것도하지 않습니다. 비동기 ... 나는이 서비스 참조를 추가 할 때 내가 무료로 가지고 그러나 나는 await ma.searchModelsAsync 내가 차단하고있어

...

사람이 되거 수를 호출?

먼저 나는 기능과 같이 전화 : 여기

private async void Button_Click_1(object sender, RoutedEventArgs e) 
{ 
    button1.IsEnabled = false; 

    var cnt = await GetDataFromWcf(); 
    button1.IsEnabled = true; 
} 

는 실제 기능입니다 내가 BTW
public async Task<List<ViewModels.ModelInfo>> GetDataFromWcf() 
{ 
    using (var ma = new DataGenic.ModelActionsServiceTypeClient()) 
    { 
     var modelInfos = await ma.searchModelsAsync(new ModelSearchCriteria { Category = "ECB" }, 1, 50); 
     return modelInfos.Select(mi => new ViewModels.ModelInfo { Id = mi.Id, Name = mi.Name, Uri = mi.Uri }).ToList(); 
    } 
} 

전화 : 나는 Task.Run(() => ...에서 함수를 세우면 내가 expcect으로 다음이 동작합니다. ..

WCF가 정말로 내가 원하는 것을 나에게 줄 수 있는지 확실하지 않은가?

+0

"차단"이란 무엇을 의미합니까? 전화가 걸렸을 때 UI가 고정되어 있습니까? – carlosfigueira

+0

정확하게 동결되었습니다 – brianbruff

+0

이것이 일어날 예정입니까? – brianbruff

답변

3

지금까지 코멘트 스레드를 기반으로 WCF 작업이 시작되기 전에 충분한 작업이있는 것처럼 들리므로 GetDataFromWcf를 호출자에게 빨리 반환하고 싶습니다. 그것은 비동기 메서드 (IMHO)와 다소 공통적 인 문제입니다. 첫 번째 'await'호출이 있기까지 동 기적으로 실행되는 'gotcha'이므로 첫 번째 'await'전에 너무 많이 발생하는 경우 눈에 띄는 UI 지연이 발생할 수 있습니다.

간단한 변경으로 비동기 메서드가 호출자에게 즉시 반환되도록 동작을 변경하는 Task.Yield (GetDataFromWcf의 첫 번째 줄에 await Task.Yield(); 추가)를 사용하는 것이 간단합니다. MSDN 문서에 언급 된대로 you can use await Task.Yield(); in an asynchronous method to force the method to complete asynchronously. 혼자 그 문장 (그리고 어리석은 그것이 표면에 들리는)은 '잡았다'IMHO를 보여줍니다 :)

관련 문제