2

内部アクションがマルチスレッド呼び出しをサポートしていないレガシー COM オブジェクトに依存しているため、WCF サービスを強制的にシングル スレッドで実行する必要があります。

次に、次のサンプルコードを書きましたが、期待どおりに動作しません:(

[ServiceContract]
public interface ITestService
{
    [OperationContract]
    void TestAction();
}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode =     ConcurrencyMode.Single)]
public class TestServiceImp : ITestService
{
    void TestAction()
    {
        Trace.WriteLine("Entering method TestAction, Thread={0}" + Thread.CurrentThread.ManagedThreadId);
        //...
        Trace.WriteLine("Leaving method TestAction, Thread={0}" + Thread.CurrentThread.ManagedThreadId);
    }
}

実際の結果は次のようなものです。

メソッド TestAction、Thread=4 に入る

メソッド TestAction を終了、Thread=4

メソッド TestAction に入る、スレッド = 5

メソッド TestAction を終了、Thread=5

メソッド TestAction、Thread=8 に入る

メソッド TestAction を終了、Thread=8

私の期待は、

メソッド TestAction、Thread=4 に入る

メソッド TestAction を終了、Thread=4

メソッド TestAction、Thread=4 に入る

メソッド TestAction を終了、Thread=4

メソッド TestAction、Thread=4 に入る

メソッド TestAction を終了、Thread=4

どうすれば欲しいものを手に入れることができますか? ありがとう。

4

3 に答える 3

1

InstanceContextMode を持つサービスを「Single」に宣言することは、異なるクライアントからのすべての呼び出しが同じインスタンスで実行されることを意味しますが、実行を担当するスレッドはスレッドプールによって管理されます。

基本的に、各呼び出しに同時実行モード「シングル」(デフォルト設定)を使用すると、スレッドはスレッドプールから取得され、使用されてから返されるため、スレッドが同じである可能性がありますが、保証されない

スレッドセーフでないリソースへのアクセスを管理する場合は、手動で行う必要があります。サービス インスタンスを実行するスレッドを定義するには、代わりに SynchronizationContext を操作する必要があります。

http://nevmehta.blogspot.ch/2006/12/what-is-usesynchronizationcontext.html

http://msdn.microsoft.com/en-us/magazine/gg598924.aspx

これがマルコに役立つことを願っています

于 2012-08-10T06:51:12.943 に答える
1

Synchronization Contexts in WCF で説明されている Thread Affinity Synchronization Context を見てください。

于 2012-08-10T16:43:36.373 に答える
0

Microsoft からの別の優れたリソース:

同時実行管理

私の場合、サービスの種類に基づいてロックを使用することになりました。

lock (typeof(MyServiceType)) {
...
}

EntityFramework コンテキストを使用する WCF サービスで Single ConcurrencyMode を設定する場合は注意してください。サービスとそのリソースは、スレッドが強制終了されるまで破棄されず、読み取り操作で更新されないデータになる可能性があるためです。

于 2016-12-12T16:37:53.770 に答える