簡體   English   中英

為多個事件顯示單個加載屏幕

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM