ユーザーは、実行に時間がかかる拡張技術操作を開始する場合があります。このような場合、通常、現在進行中のタスクに関する情報とともに、何らかのプログレスバーを表示すると便利です。
UIとロジックレイヤーの密接な結合を避けるために、通常、何らかのプロキシを介して通信を行うことが最善です。つまり、バックエンドは独自のUI要素を操作したり、中間層と直接対話したりすることはできません。
明らかに、これを機能させるためにはどこかにコールバックが必要です。通常、2つの方法のいずれかで実装しました。
可変オブジェクトをバックエンドに渡し、進行中にバックエンドに変更を加えます。オブジェクトは、変更が発生するとフロントエンドに通知します。
フォームのコールバック関数を渡す
void f(ProgressObject)
かProgressObject -> unit
、バックエンドが呼び出します。この場合、バックエンドはを構築し、ProgressObject
完全に受動的です。進行状況を報告するたびに新しいオブジェクトを作成する必要があると思います。
これらの方法の欠点と利点は何ですか?合意された最適な使用方法はありますか?それらの使用には異なる状況がありますか?
私が見落としている進捗状況を報告するための完全に異なるテクニックはありますか?
BackgroundWorker
RHが言及していることを使用します。「進行形」などとともにカスタムクラスにラップされ、例外を通信するためのシンプルなメカニズム- BackgroundWorker
設計上、別のスレッドで実行されます。.Netが提案する方法でその機能を使用する限り、それは慣用的と言えるでしょう。また、特定の言語/フレームワークのコンテキストでは、「イディオマティック」が最適かもしれません。