3

我的应用程序同时从多个 URL 下载。它们中没有一个同时完成,但我只想要一个加载屏幕让用户看到正在发生的事情:-)

我试过一个“票”系统,我有一个列表<>。每个触发下载的事件都会在列表中添加一张票。当他们完成后,他们删除一个。然后,我有一个每 200 毫秒运行一次的 BackgroundWorker 来检查这个列表。如果列表计数为 0 并且存在加载屏幕 (UserControl)(busyscreen.GetType().Name 与 this.LayoutRoot.Children 中的每个对象进行比较),它将删除子项。如果列表不是 0 并且没有子名称busyscreen,它会被添加。

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

4

2 回答 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 的替代方案?

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

于 2012-06-25T15:49:17.147 回答
0

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

于 2012-06-26T09:00:26.890 回答