データベースでタスクを実行することになっているC#の多層アプリケーションがあります(初めて使用する場合は、データベースを作成してデータを入力する場合があります)。最初にアプリケーションを設計したとき、進行状況のレポートは言うまでもなく、進行状況バー コントロールの可能性についても考慮していませんでした。データベース操作の進行状況を UI レイヤーに報告できるようにアプリケーションの設計を変更するにはどうすればよいですか? 再利用可能で、レポート用に追加の入力を取得するためにすべての関数を変更する必要がないソリューションはありますか?
3 に答える
グレッグが言ったように、この先にはたくさんの仕事があります。ただし、問題に対処する方法は多数あります。最適な方法は、クライアントからアプリケーション/データベース レイヤーに既に渡されているコンテキスト情報によって異なります。たとえば、クエリ/トランザクションを実行する通常の過程でセッショントークンまたはトランザクション識別子がクライアントからアプリケーションに渡される場合、またはアプリケーションからクライアントに非同期で返される確認応答参照が渡される場合、それらのクエリ/トランザクションに対して、進行状況レポートが必要だった場合は、クライアントが照会できるステータス テーブルをアプリケーションで更新できます。これにより、必要な再作業の量を減らすことができます。基本的に、「ミドルウェア」が既に配置されていることを検討し、それらのいずれかを活用して、層全体でトランザクションを関連付けることができるかどうかを確認する必要があります。
いいえ。アプリケーションの規模にもよりますが、多くの作業が待ち構えています。
進行状況レポートが機能するには、作業単位が完了したときにイベントを発生させる作業を実行しているコードが必要です。そのイベントは UI レイヤーで処理し、進行状況インジケーターを更新する必要があります。
開始するのに適した場所は、BackgroundWorker の使用を検討することです (MSDN に例があります - http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx )。BackgroundWorker に慣れると、アプリケーションにどのような変更を加える必要があるかを判断しやすくなります。
サーバー コードを変更して、サーバー エンドで進行状況情報を更新し (関数シグネチャを変更せずに)、この情報を個別にクエリできる別のメソッドを用意することができます。
これにより、サーバーへの既存の呼び出しにまったく影響を与えることなく、進行状況のサポートを後付けすることができます。UI に新しいバックグラウンド スレッドを追加するだけで、長時間実行されるタスクの進行中に更新された進行状況情報を確認できます。
編集:クライアントで行われるタスクにも同じアプローチが機能すると思います。それでも、ここでも静的な進行状況インジケーター クラスを使用できます。