2015-01-05 4 views
1

서비스 버스 릴레이가 비동기 wcf 작업을 지원합니까?하늘색 서비스 버스 릴레이는 비동기 wcf 작동을 지원합니까?

서버가 다음 코드를 사용하여 의미있는 응답을 보내지 못했습니다. 그것이 잘 작동하더라도 나는 30 초로 timespan을 바꾸는 경우에. 이 튜토리얼을 따라 시작

http://azure.microsoft.com/en-us/documentation/articles/service-bus-dotnet-how-to-use-relay

클라이언트 코드 :

var task = Task<string>.Factory.FromAsync(channel.BeginDoEcho, channel.EndDoEcho, input, null); 
Console.WriteLine("Server echoed: {0}", task.Result); 

서버 코드 :

public IAsyncResult BeginDoEcho(string text, AsyncCallback callback, object state) 
{ 
    var task = Task<string>.Factory.StartNew(x => 
    { 
     Thread.Sleep(TimeSpan.FromMinutes(5)); 
     return text; 
    }, state); 
    return task.ContinueWith(result => callback(task)); 
} 

public string EndDoEcho(IAsyncResult result) 
{ 
    return ((Task<string>) result).Result; 
} 
+0

"제대로 작동해도 시간 초과를 30 초로 변경하면됩니다." - 시간 제한은 어디에서 지정 했습니까? 질문에 명시된 바와 같이 서버 측 코드에는 5 분간 잠이 있습니다. 코드/설정을 이해할 수 있는지 확실하지 않습니다. –

+0

나는 TimeSpan.FromMinutes (5)를 TimeSpan.FromSeconds (30)로 바꿨다. –

답변

1

Azure cannot tell whether you have implemented your service synchronously or asynchronously.이 온 - 더 - 쓰기 노출되지 않는 구현 세부입니다 . 문제가 발생한 이유가 무엇이든간에 - 서비스와 통신하는 원격 측이 비동기에 영향을받는 것은 아닙니다.

사실 비동기 사용 여부와 상관없이 클라이언트와 서버를 독립적으로 결정할 수 있습니다.

주어진 코드를 사용하면 서버가 응답하는데 5 분이 걸리기 때문에 시간 초과가 5 분 미만이면 항상 시간 초과 오류가 표시됩니다. 서버가 즉시 5 분 후에 완료되는 IAsyncResult을 반환하는 경우는 아닙니다. IAsyncResult은 직렬화 할 수 없으므로 절대로 전 달되지 않습니다. 전혀 아무 것도 5 분 동안 보내지 않습니다.

이 질문과 관련이 없습니다. 비동기를 구현하려면 await을 사용하십시오. 훨씬 쉽게.

현재 서버 구현에 문제가 있습니다. 동기 절전 모드로 5 분 동안 스레드를 차단하고 있습니다. 이는 비동기의 이점을 완전히 무효화합니다. 이와 같은 많은 작업이 동시에 실행되는 경우 스레드 풀이 고갈됩니다.

+0

좋아, 하늘빛 유휴 연결 시간 초과를 처리하려고 할 때 async에서 아무것도 사지 않을 것이다. 백그라운드 스레드에서 작업을 시작한 다음 (일부 방식으로) 서버를 폴링하여 작업이 완료되었는지 확인해야합니다. –

+0

이것은 예제 코드 일 뿐이며, 실제 서버 코드는 실제로 잠을 자지 않습니다. 그러나 때때로 가끔 걸릴 수 있습니다 :) –