2010-01-12 1 views
0

Silverlight에서 모든 wcf 서비스 호출이 비동기임을 모두 알고 있습니다. 그러나 요청의시기에 관해 우리는 무엇을 말할 수 있습니까? 다음 코드의 경우, "Hello A"가 "Hello B"전에 서버에 수신된다는 것은 언제나 사실입니까?Silverlight에서 wcf 호출 타이밍

ServiceClient proxy = new ServiceClient();
ServiceClient proxy2 = new ServiceClient();

proxy.SayHelloAsync ("Hello A");
proxy2.SayHelloAsync ("Hello B");

코드를 반복적으로 실행했으며 서버는 항상 "Hello A"를 먼저 받았습니다. 운이 좋았습니까?

답변

0

예, 비동기 호출이 두 개인 경우 먼저 완료 할 수 있습니다. 당신이 완료 어떤 대기해야하는 경우

, 당신은 그냥 행운이었다 WaitHandle

0

에보고해야한다. 나는 거의 똑같은 테스트를했고, 여러 가지 다른 명령으로 끝내도록했습니다. 이는 실제 상황 시나리오에서 특히 그러합니다. 즉, 많은 수의 미해결 통화가 동시에 (예 : 채팅 응용 프로그램에서) 진행될 수 있습니다. 전화 B가 끝나기 전에 전화 A가 필요하면 어떤 방식으로 연결해야합니다. 그렇게하기위한 메커니즘은 매우 깨끗합니다. 내 일례로 어떤 종류의 WaitHandle을 사용하는 것이 위험 할 수 있습니다. 귀하의 마일리지는 다를 수 있지만, 내가 찾은 것은 WaitHandle을 사용하여 WCF 호출의 타이밍을 관리하면 중요한 스레드가 작동하지 않도록 할 수 있다는 점입니다. "A"가 완료 될 때 호출되는 메서드에서 "B"를 호출하는 것이 더 복잡하지만 더 좋습니다.

+0

WaitHandle에 대한 귀하의 분석에 동의합니다. 더 많은주의가 필요합니다. 대부분의 경우 연쇄가 더 좋을 수도 있지만 두 호가 병행하여 실행될 수 있다면 비용이 많이들 수 있습니다. 구체적으로 할당 된 백그라운드 스레드 (몇 가지 중요한 토드가없는 것)에 두 개의 waithandles를 사용하는 것은 상당히 간단해야합니다. – AnthonyWJones

+0

그게 내 이해이기도하지만, Silverlight가 WCF 호출을 UI 스레드에 마샬링하여 때때로 이상한 일들을 수행한다는 것을 알고 있습니다. 마지막으로 ManualResetEvent와 함께 의사 동기화 패턴을 사용하여 코드를 단순화하려고 시도했지만 안정적으로 작동하지 못했습니다. 호출이 절대 반환되지 않습니다. 그러나 내가 취하는 정확한 접근 방식을 기억하지 못하고, 내가하는 것보다 스레딩 문제에 대해 더 많이 이해하는 사람은 더 나은 행운을 누릴 수 있습니다. –