2009-12-17 6 views
3

저는 여러 웹 서비스에 대해 여러 비동기 요청을하는 Silverlight 앱을 개발하고 있습니다. 모달 "로딩"대화 상자가 모든 요청이 완료 될 때까지 활성 상태를 유지하기를 원합니다. 나는 각 비동기 요청 시작 이벤트에서 증가하는 카운터 변수를 사용하여 상황을 관리하고 각 비동기 완료 이벤트를 감소시킨다 (나에게 안전하지 않은 스레드로 보임). 카운터가 0 일 때 UI에 바인딩 된 속성은 대화 상자를 끕니다. 내 카운터 솔루션보다이 문제를 다루는 더 좋고/더 일반적인 방법이 있습니까?여러 비동기 요청 동기화

답변

0

카운터 솔루션이 유효합니다. 무엇을 하든지, 모든 요청을 추적하고 그들이 언제 도착하는지 (카운트가 0이 될 때) 이해해야합니다.

완료되면 이벤트를 반환하는 일부 MultiAsyncWaiter 클래스에이 구현을 모두 넣는 것처럼 코드를 정리할 수 있습니다. 그러나 근본적인 영향은 동일하게 유지 될 것입니다 : 그들이 모두 돌아올 때까지 추적하십시오.

int의 스레드가 안전하지 않다고 말하는 것이 맞습니다. 연동 연산 (주석 참조)을 사용하거나 변수를 잠그면 구현 스레드를 안전하게 유지할 수 있습니다.

휘발성 키워드가 작동하지 않는 이유 : 여러 스레드가 변수를 변경하면 기술적으로 읽기 + 쓰기 작업 인 감소에 연동 작업이 필요합니다. 이것은 다른 스레드가 읽기와 쓰기 사이의 값을 변경할 수 있기 때문입니다.

+1

int를 휘발성으로 만드는 것으로 충분하지 않습니다. Interlocked.Increment와 .Decrement를 사용하여 손실 된 업데이트를받지 않도록해야합니다 (http://msdn.microsoft.com/en-us/library/dd78zt0c). .aspx) –

+0

감사합니다. 답변이 업데이트되었습니다. – santosc

+0

답변 주셔서 감사합니다; 실버 라이트를 탑재 한 Rx 프레임 워크에 대해 알아 냈고 IObservable 인터페이스에서 ForkJoin() 메서드를 사용했습니다 (꽤 놀라운 내용입니다. http://www.minddriven.de/?p=563&cpage=). 1 # comment-4425) – gn22