我的应用同时从多个网址下载。不是它们同时完成,但我只想要一个加载屏幕让用户看到正在发生的事情: - )
我尝试了一个“票证”系统,我有一个List<&gt ;.触发下载的每个事件都会向列表添加票证。完成后,他们删除一个。 然后我有一个每200ms运行一次的BackgroundWorker来检查这个列表。如果列表计数为0且loadingscreen(UserControl)存在(busyscreen.GetType()。名称与this.LayoutRoot.Children中的每个对象进行比较),则删除子项。 如果列表不为0并且没有子名称busyscreen它将被添加。
这种逻辑有什么问题?我似乎无法让它工作,有没有更好的方法来做这种工作?
答案 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
,您可以显示“加载屏幕”。