[英]Showing a single loadingscreen for multiple events
我的應用程序同時從多個URL下載。 它們不同時完成,但我只想要一個加載屏幕讓用戶看到正在發生的事情:-)
我試過一個“票證”系統,我有一個List <>。 觸發下載的每個事件都會向列表添加票證。 完成后,他們刪除一個。 然后我有一個每200ms運行一次的BackgroundWorker來檢查這個列表。 如果列表計數為0且loadingscreen(UserControl)存在(busyscreen.GetType()。名稱與this.LayoutRoot.Children中的每個對象進行比較),則刪除子項。 如果列表不為0並且沒有子名稱busyscreen則會添加。
這個邏輯出了什么問題? 我似乎無法讓它工作,有沒有更好的方法來做這種工作?
理想情況下,您希望使用阻塞和WaitHandle之類的東西 - 您可以使代碼阻塞,直到發出信號為止
http://msdn.microsoft.com/en-us/library/system.threading.waithandle.aspx
基本上,您創建一個ManualResetEvent對象數組 - 這些對象將在完成工作時向主線程發出信號
然后你打電話
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在Windows Phone上不起作用。 這里有一個替代方案:
Windows Phone上WaitHandle.WaitAll的替代方案?
這似乎可以完成這項工作。 考慮使用它,因為我總是發現理想情況下應該阻止的代碼,當與計時器一起使用時可以工作但是更加繁瑣且易於出錯
您可以創建包含LoadCount
屬性和loadCount字段的Singleton
對象(當然不要忘記INotifyProeprtyChanged
),您可以根據需要進一步使用它。 當您從新URL開始下載時,請執行Interlocked.Increment(ref loadCount);
並在回調上 - Interlocked.Decrement(ref loadCount);
。
根據LoadCount
您可以顯示“加載屏幕”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.