2012-03-26 14 views
1

WPF(UI)アプリケーション用のWCF RESTfulサービスを作成しました。 UIはWCFサービスに要求を送信し、WCFサービスはBLLで適切なメソッドを呼び出し、次にDALでメソッドを呼び出します。これらの層はすべてIOC/DIを使用して分離されています。WCF RESTfulサービスのAnsyncスレッド

新しい機能については、特定のタイプの新しいオブジェクトがデータベースに追加されたときに、別のスレッドで実行される3つのステップを実行する必要があります。

サービスが新しいオブジェクトOBJをデータベースに追加する要求をBLLに送信すると、BLLはDALを介してオブジェクトをデータベースに保存し、新しいスレッドを開始してオブジェクトに何も実行しません。 WCF要求をブロックします。

しかし、BLLで新しいスレッドを開始すると、アプリケーションがクラッシュします。これは、データベースコンテキストの 'InRequestScope'オブジェクトが破棄され、スレッドがデータベースを更新できないためです。また、WCF要求は、戻り値が提供され、BLLメソッドが実行を完了したにもかかわらず、スレッドが完了するまで終了しません。

どんな助けがあれほど価値があります。

答えて

1

私はこの問題の解決策と説明を理解しました。愚かなものに変わります。

私はBLL(IsBackground = true;)からスレッドを作成していたので、親スレッド(サービス要求の元)がこのスレッドの終了を待っていました。両方のスレッドが終了すると、応答がクライアントに返されました。そしてその解決法は、代わりにBackgroundWorkerを使用します。ロケット科学はなく、常識です。

コンテキストを破棄するために、オブジェクトがInRequestScopeであり、要求が終了していたためです。したがって、リポジトリがUnitOfWork(uow/context)を必要とするたびに、新しいコンテキストを生成し、データベース要求が完了するとすぐに終了します。そして、解決策は、インスタンスを作成し、変数に格納し、使用する必要のあるリポジトリに渡し、すべてのリポジトリに新しいインスタンスを作成するよりも、同じインスタンスを使用させることです。

0

これは、サービス側の懸念よりもクライアント側の懸念のほうが多いようです。クライアントがWCFサービスに対して非同期要求を行うのは、サービスにマルチスレッドアクセスを自動的に提供するからです。

(WebHttpBindingまたはWCF Web APIエンドポイントにアクセスしているため)組み込みのSystem.Net.WebClientを非同期で使用できます。このblog postは、どのように完了したかを簡単に示します。このMSDN articleは、ファイルI/Oに適用されるようですが、約3/4ダウンしていますが、非同期WebClientの使用方法の詳細な説明があります。

+0

さらに、クライアントが応答を待つことがないように、サーバー上でプロセスを実行する必要がありました。サーバーサイドのプロセスを超えていると、クライアントがシャットダウンしても実行されます。また、サーバー上のトラフィックを減らすこともできます。 –

関連する問題