3

私のアプリは同時に複数のURLからダウンロードします。それらのどれも同時に終了しませんが、何かが起こっていることをユーザーに見せるためのロード画面が1つだけ欲しいです:-)

リスト<>がある「チケット」システムを試しました。ダウンロードをトリガーする各イベントは、リストにチケットを追加します。それらが完了すると、1つを削除します。次に、このリストをチェックするBackgroundWorkerを200ミリ秒ごとに実行します。リスト数が0で、loadingscreen(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はWindowsPhoneでは機能しません。ここにそれに代わるものがあります:

Windows PhoneでのWaitHandle.WaitAllの代替手段は?

それは仕事をするようです。タイマーと一緒に使用すると、理想的にはブロックする必要があるコードは機能しますが、より厄介でバグが発生しやすいため、使用を検討してください。

于 2012-06-25T15:49:17.147 に答える
0

プロパティとloadCountフィールド(もちろん忘れないでください)をSingleton含むオブジェクトを作成して、必要に応じてさらに使用することができます。新しいURLからダウンロードを開始するときは、コールバックのように実行します- 。場合によっては「ロード画面」を表示できます。LoadCountINotifyProeprtyChangedInterlocked.Increment(ref loadCount);Interlocked.Decrement(ref loadCount);
LoadCount

于 2012-06-26T09:00:26.890 に答える