2009-09-16 8 views

答えて

0

いいえ、これは決してしたく​​ないからです。あなたは本当に何を達成しようとしていますか?来るより多くの情報に基づいて

EDIT

は、ここで私が何を考えています。

リクエストごとに「スティッキー状態」を使用する場合は、インスタンス上で状態を使用し、marc_sの応答に従ってInstanceContextMode.PerCallを使用する必要があります。

呼び出しのスレッドローカルストレージにある状態が必要な場合は、ICallContextInitializerを使用して、WCFがメソッドを呼び出すために選択したスレッドに状態をマーシャリングする方法を検討できます(スレッド状態をクリーンアップします)。コールが終了したとき)。

しかし、あなたは "どのスレッド"に気を付けるべきではありません。 WCFはあなたのためにスレッドプールでそれを処理します。

+0

もう少し説明できますか? –

+0

アイデアは、要求内でdbセッション、資格情報などをThreadContextに格納して共有することです。これは、ロールバックなどを行う際に役立ちます。 – Nazgul

+0

もちろん、これは実際には推奨されるベストプラクティスです!この正確な目的のためにServiceHostにワーカースレッドのプールがあります –

6

はい、これを行うことができます。これは、リクエストごとの「コールごと」処理と呼ばれます。 ServiceHostは、その1つの要求を処理するために入ってくるリクエストごとに、サービスクラスの新しいインスタンスを作成します。

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)] 
public class YourService : IYourService 
{ 
... 
} 

マルク・

: -

はこれを行うには、あなたが「PerCall」であるためにあなたのサービスクラス(サービス・インターフェースを実装する1)を設定する必要があり、あなたのサービスクラスに属性を適用することにより、これを行います

+0

これは呼び出しごとに新しいServiceインスタンスを作成しますが、呼び出しごとに新しいスレッドを生成しません。 – Nazgul

+0

しかし、要求を処理するために新しいサービスインスタンスをワーカースレッドに割り当てます。 –

+1

私はあなたがこれ以上のことをすることはできないと思います。私は、WCFの設定のうち、特にリクエストごとに新しいスレッドを作成する設定についてはわかりません。そして、なぜあなたは本当にしたいですか?本格的なスレッドを作成するのは、非常にコストがかかる作業です。なぜなら、すでに利用可能な組み込みのワーカースレッドプールを使用しないのはなぜですか? –

3

は正確にあなたが望むものに依存しますが、以下のサービスの動作は、それを解決します:

ServiceBehavior: 
ConcurrencyMode=ConcurrencyMode.Multiple 
InstanceContextMode=InstanceContextMode.Single 

あなたのクラスはシングルトンになりますが、メソッドに対して行われたすべてのコールがSEPARで実行されますスレッドを食べた。手動で行う必要があるにもかかわらず、同期が必要な場合。

また、潜在的なパフォーマンスの問題を認識するためにスロットルを調べることを忘れないでください。

関連する問題