2

タイトルが少しわかりにくい場合は申し訳ありませんが、私はそれを正しく表現することができませんでした。

基本的に、私が持っているのは次のシナリオです。

ユーザーがダウンロードする複数のファイルを選択し、[ダウンロード]ボタンを押してダウンロードを開始できるユーザーインターフェイス(WinForm)があります。フォームのロックを回避するために、すべてのダウンロードは非同期で処理されます。ただし、フォームが「応答していません」というメッセージでロックされることは望ましくありませんが、ダウンロードの実行中にユーザーがフォームフィールドを変更できるようにすることも望んでいません。

理想的には、ダウンロードの状態をユーザーに知らせるモーダルダイアログを生成したかったのです(つまり、モーダルダイアログを除いてFirefoxに似ています)。これにより、ユーザーはダウンロードの進行状況をよく確認できると同時に、ダイアログがアクティブなときに親フォームを操作するのを停止できるため、1つの石で2羽の鳥を殺します。

ただし、ダウンロードの進行状況をユーザーに適切に知らせるには、実行時にダイアログを更新する必要があります。これは私が壁にぶつかったところです。私の現在のアイデアは、ダイアログクラスのいくつかのパブリックメソッドを公開して、ファイルが完了したときに更新を送信し、バックグラウンドのダウンロードスレッド内からそれらを呼び出すことです(更新コントロールなどの適切なデリゲートを使用)

これは私が望むように機能すると確信していますが、この問題に対してもっとエレガントな解決策があるかどうか疑問に思っていました。ダイアログアプローチに限定されているとは思わないでください。私は、より良い代替手段を提供する可能性のあるすべてのアプローチを受け入れています。

乾杯、J

4

1 に答える 1

1

代替案1

あなたはBackgroundWorkerの使用を検討するかもしれません、それは仕事をするために新しいスレッドを設定することを取り、進行状況を報告するためのイベントベースのメカニズムと操作のキャンセルを要求する方法を提供します(あなたがそれを使いたいかどうかはあなた次第です)。

BackgroundWorkerのタスクを設定するには、イベントにハンドラーをアタッチしてから、DoWorkを呼び出す必要がありますRunWorkerAsync()

代替案2

もう1つの方法は、ダウンロードの進行状況に応答するメカニズムを作成するために使用することです。その後、 ReactiveIObservable<T>を使用してバインディングを実行できます。

私はあなたがリアクティブに不慣れだと思います。その場合、これは利用可能な最良の紹介です(私の意見では):

http://channel9.msdn.com/Blogs/codefest/DC2010T0100-Keynote-Rx-curing-your-asynchronous-programming-blues


UIを無効にしない自由があった場合...ステータスバーで進行状況を報告するか、現在の状態と保留中の作業。

于 2012-06-01T07:52:57.957 に答える