私のサービスでビジネスレイヤーへの非同期呼び出しが行われ、イベントがサービスに戻るのを待つ同様の問題が発生しました。イベントが発生するたびに、コールバックコンテキストが失われました。私はこれがなぜであるかの詳細を掘り下げませんでしたが、本質的にcurrentcontextへの参照を格納し、別のThreadを呼び出してビジネスレイヤを呼び出すという回避策を実装してしまいました。私は参照を保存しています。
1)自分の入力要求とコールバックへの参照の両方を含む新しいクラスを作成します。
public struct MyCallbackDetails {
public MyCallbackDetails(IMyServiceCallback callback, RequestType request) : this()
Callback = callback;
Request = request;
}
public IMyServiceCallback Callback { get; set; }
public RequestType request { get; set; }
}
2)その後、私はMyCallbackDetailsを渡して別々のスレッドをオフに解雇だろうではなく、単に要求の対象:
public ResponseType MyServiceMethod(RequestType request) {
//...Do Some Stuff
//Create MyCallbackDetails object to store reference to the callback and keep channel open
MyCallDetails callDetails = new MyCallDetails(OperationContext.Current.GetCallbackChannel<IMyServiceCallback>(), request);
//Fire off a new thread to call the BL and do some work
Thread processThread = new Thread(RunCallbackMethod);
processThread.Start(callDetails);
}
3)そして、私のRunCallbackMethodがBLの呼び出しを行うと、コールバックで応答します。
void RunCallBackMethod(Object requestDetails)
{
//Use callbackdetails to make BL calls
MyCallbackDetails callDetails = (MyCallbackDetails)requestDetails;
// Make BL call - all code under here is syncrhonous
ResponseType response = BusinessLayer.BusinessMethod(callDetails.Request);
//NB: If your responsetype is a business object you will need to convert it to a service object
callDetails.Callback.SomeMethod(results);
}
NB:はい、私はすぐに戻ってサービス層への私のビジネスレイヤ火災からのイベントを持って離れて行っているしかし、私は、ビジネスレイヤのための別々のスレッドをオフに発射していて、それはまだ非同期に実行され、同じ動作をしますあたかも私がBLをASyncの方法で直接呼び出していて、イベントが完了したことを通知するのを待っているかのように。
PS:これを実装するためのアイデアとコードのほとんどはRoryです。
コールバックを行うとサービスがまだ開いていますか? – Gromer