2009-08-28 23 views
1

現在のプロジェクトでは、いくつかの操作のために、OrderId ...のような関連情報とともにCOMPLETED-Order、STARTED-REQUECTED-REJECTED-Orderのようなメッセージをデータベースに送信します。コマンドパターンを実装するCommandクラスに対応します。ThreadPool他のタスクの完了に依存するタスク

interface ICommand 
{ 
    void Execute(); 
} 

public class RequestStartedCommand:ICommand 
{ 
    public void Execute() 
    { 
    //do the related work..... 
    } 
} 

//other commands... 

Windowsサービスは、このメッセージを消費してからコマンドを上記のものに変換し、ThreadPoolでコマンドを実行します。

しかし、OrderID = 23のCOMPLETED-Orderコマンドは、同じ注文のREJECTED-Orderコマンドの前に実行する必要があります。どのようにすればよいのですか?どの戦略に従うべきですか?どのような例やドキュメンテーションも便利です。

答えて

1

私はいくつかの依存関係チェックを実装しようとします。何かのように、拒否された注文コマンドは、実行される前に状態が有効であるかどうかをチェックする必要があります。 マネージャ/サービスshoudlはリストからコマンドを受け取り、その妥当性検査を適用し、そのような妥当性検査が完了していない場合はリストに戻します。

飢えやコマンドが永遠にリストに詰まってしまうことに注意してください。

0

私たちはこれを達成するためにAmi Barによって書かれたSmart Thread Poolを使用してきました。これは数年前から生産されており、当時は.NET 1.1の実装が不足していたために選ばれました。

STPは、グループの同時スレッド数を1に設定すると、関連する作業項目をキューに入れるために使用できる作業項目グループを実装します。50-100のオンラインクライアントでは、使用に問題はありませんでした。

0

コマンドを連鎖させ、他のコマンドに完了、成功、失敗、キャンセルされたコマンドを通知する方法を作成しました。これらの通知をどのように伝えるかについては、オブザーバーのパターン(http://en.wikipedia.org/wiki/Observer_pattern)をご覧ください。また、コマンドの循環依存性に注意してください。したがって、2つのコマンドがお互いに待っている場合、どちらも実行されません。私はおそらくこれを実装するためにイベントを使用します。

0

スレッドプールを使用している場合は、おそらくリクエストのキューがあります。キュー内の各要求オブジェクトに依存要求のコレクションを追加することができます。プライマリ要求が完了すると、スレッドprocはプライマリ要求としてキューに依存する要求を入れます:

class RequestObject { 
    // ... request details 
    List <RequestObject> dependentRequests; 
}

void PerformRequest (RequestObject request) { // ... perform the requested object foreach (var dr in request.dependentRequests) AddRequestToQueue (dr); }

関連する問題