显示单个加载屏幕用于多个事件

3
我的应用程序同时从几个 URL 下载。它们都没有在同一时间完成,但我只想让用户看到一个加载屏幕,以便他们知道事情正在进行中 :-)
我尝试使用“票务”系统,其中我有一个 List<>。触发下载的每个事件都会向列表添加一个票据。当下载完成后,它们将删除一个票据。 然后,我有一个 BackgroundWorker 每 200 毫秒运行一次,检查此列表。如果列表计数为 0 并且加载屏幕 (UserControl) 存在( busyscreen.GetType().Name 与此.LayoutRoot.Children 中的每个对象进行比较),则移除该子项。 如果列表不是 0 并且没有名为 busyscreen 的子项,则将其添加。
这种逻辑有什么问题吗?我似乎无法使其工作,是否有更好的方法来完成这种工作?

对我来说看起来没问题(我可能会使用计时器而不是后台工作器,但这只是一个小细节)……如果它不起作用会发生什么? - Nate
2个回答

2
理想情况下,您希望使用阻塞和类似于 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替代方法? 看起来它会完成工作。考虑使用它,因为我总是发现,当与计时器一起使用时,本来应该阻塞的代码可以工作,但更加繁琐且容易出错。

啊,那就此打住了! - Charleh

0
您可以创建一个包含LoadCount属性和loadCount字段(当然不要忘记关于INotifyProeprtyChanged)的Singleton对象,您可以根据需要进一步使用它。当您从新的URL开始下载时,请执行类似以下操作:Interlocked.Increment(ref loadCount);并在回调上执行Interlocked.Decrement(ref loadCount);。根据LoadCount您可以显示“加载屏幕”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接