为多个事件显示单个加载屏幕

时间:2012-06-25 15:37:39

标签: c# windows-phone-7

我的应用同时从多个网址下载。不是它们同时完成,但我只想要一个加载屏幕让用户看到正在发生的事情: - )

我尝试了一个“票证”系统,我有一个List<&gt ;.触发下载的每个事件都会向列表添加票证。完成后,他们删除一个。 然后我有一个每200ms运行一次的BackgroundWorker来检查这个列表。如果列表计数为0且loadingscreen(UserControl)存在(busyscreen.GetType()。名称与this.LayoutRoot.Children中的每个对象进行比较),则删除子项。 如果列表不为0并且没有子名称busyscreen它将被添加。

这种逻辑有什么问题?我似乎无法让它工作,有没有更好的方法来做这种工作?

2 个答案:

答案 0 :(得分: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上不起作用。这里有一个替代方案:

Alternatives for WaitHandle.WaitAll on Windows Phone?

这似乎可以完成这项工作。考虑使用它是因为我总是发现理想情况下应该阻止的代码,当与计时器一起使用可以工作但是更加繁琐且容易出错

答案 1 :(得分:0)

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