2012-06-25 10 views
3

동시에 여러 URL에서 내 앱이 다운로드됩니다. 그들 중 누구도 동시에 끝내지는 않지만 사용자가 무언가가 진행되고 있음을 알리는 하나의 로딩 화면 만 원합니다.여러 이벤트에 대해 하나의로드 스크린 표시

"<"목록이있는 "티켓"시스템을 사용해 보았습니다. 다운로드를 트리거하는 각 이벤트는 티켓을 목록에 추가합니다. 그들이 완료되면 그들은 하나를 제거합니다. 나는이 목록을 검사하는 매 200ms마다 실행중인 BackgroundWorker를 가지고있다. 목록 개수가 0이고 loadingscreen (UserControl)이 존재하면 (busyscreen.GetType(). this.LayoutRoot.Children의 모든 객체와 이름 비교) 자식을 제거합니다. 목록이 0이 아니며 하위 이름 busyscreen이 없으면 추가됩니다.

이 논리에 어떤 문제가 있습니까? 나는 그것을 작동시키지 않는 것 같은데, 이런 종류의 일을하는 더 좋은 방법이 있을까요? 이러한 개체가에 신호를 보낸다 -

+0

(배경 작업자 대신 타이머를 사용 하겠지만 사소한 세부 사항입니다 ...) 작동하지 않을 때 어떤 일이 발생합니까? – Nate

답변

2

이상적으로 당신은 기본적으로, 당신은으로 ManualResetEvent 객체의 배열을 만들

http://msdn.microsoft.com/en-us/library/system.threading.waithandle.aspx

를 계속하라는 지시를 내 렸습니다 때까지 당신이 당신의 코드 블록을 만들 수 있습니다 WaitHandle-처럼 차단하고 뭔가 사용하려면 작업이 그럼 당신은

WaitHandle.WaitAll(arrayOfManualResetEvents) 

전화

을 수행 메인 쓰레드있는 리셋 이벤트가 의사에 따라서
ManualResetEvent.Set() 

을 신호 할 때까지 차단됩니다

> Create each URL loader 
> Create a ManualResetEvent for each loader 
> Start each loader loading 
> Call WaitHandle.WaitAll(arrayOfManualResets) which will block on your main thread 
> In each URL LoadComplete handler call the associated ManualResetEvent.Set() 
> The main thread will continue when all are signalled 

편집 : 지적 한 바와 같이이 - WaitHandle.WaitAll가 윈도우 폰에서 작동하지 않습니다.

Alternatives for WaitHandle.WaitAll on Windows Phone?

는 일을 할 것처럼 보인다 : 여기에 대한 대안이있다. 난 항상 이상적으로 차단해야하는 코드를 찾을 수 있기 때문에 사용을 고려, 물론 (당신은 LoadCount 재산과 loadCount 필드가 포함됩니다 Singleton 개체를 만들 수 있습니다

+2

기억 하듯이,'WaitAll'은'Windows Phone'에서 작동하지 않습니다. – Ku6opr

+0

아, 그러면 그때 그만하겠습니다! – Charleh

0

버그 타이머와 작업을 사용하지만, 더 가로장 설치 등등과 경향 때 INotifyProeprtyChanged에 대해 잊지 말고 필요에 따라 더 사용할 수 있습니다. 새 URL에서 다운로드를 시작하면 Interlocked.Increment(ref loadCount);과 같은 콜백을 수행하십시오 - Interlocked.Decrement(ref loadCount);.
LoadCount에 따라 "화면로드 중"을 표시 할 수 있습니다.

관련 문제