繁体   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