2013-05-06 4 views
8

C# 5 비동기/대기 기능을 사용하여 SignalR 응용 프로그램을 만들려고하지만 코드가 실행될 때마다 System.InvalidOperationException이 발생합니다. 다음은 문제를 재현 할 수있는 가장 간단한 코드입니다.SignalR - 허브에서 비동기 작업을 수행하는 방법은 무엇입니까?

public class SampleHub : Hub 
{ 
    public Task<string> GetGoogle() 
    { 
     var http = new WebClient(); 
     return http.DownloadStringTaskAsync("http://www.google.com"); 
    } 
} 

예외 세부 정보 :

비동기 작업은이 시간에 시작할 수 없습니다. 비동기 작업은 비동기 처리기 또는 모듈 내에서만 또는 페이지 수명주기의 특정 이벤트 중에 시작될 수 있습니다. 페이지를 실행하는 동안이 예외가 발생하면 페이지가 < % @ Page Async = \ "true \"%>로 표시되어 있는지 확인하십시오.

스택 추적 : 클라이언트 측에

at System.Web.AspNetSynchronizationContext.OperationStarted() 
at System.Net.WebClient.DownloadStringAsync(Uri address, Object userToken) 
at System.Net.WebClient.DownloadStringTaskAsync(Uri address) 
at System.Net.WebClient.DownloadStringTaskAsync(String address) 

은 자바 스크립트는 다음과 같습니다.

$.connection.hub.start().done(function() { 
    $('#google').click(function() { 
     var google = sample.server.getGoogle(); 
     console.log(google); 
    }); 
}); 

내가 뭘 잘못 했니? 해결 방법이 있습니까? 나는 가능하다면 C#의 비동기/대기 패턴에 충실하기를 정말로 원한다.

+0

메서드 이름 앞에 async 키워드를 추가하여 GetGoogle 메서드를 비동기 적으로 만들었습니까? –

+0

예, 시도했지만 작동하지 않았습니다. 스티븐의 대답이 드디어 내 문제를 해결했습니다. –

답변

10

나는 HttpClient으로 WebClient을 바꾸려고합니다. DownloadStringTaskAsync은 기존 EAP 방법에 비해 async에 대한 일종의 "볼트 온 (bolt-on)"지원이며 SignalR이 반대하는 EAP 방법입니다. HttpClientTAP을 직접 사용합니다.

+0

정말 고마워요! 나는 그 일을하기 위해 2 박을 보냈다. 그리고 나는 좋은 오래된 WebClient가 범인이라는 것을 결코 두드리지 않았다. –

관련 문제