3

次のようなサービスコードがあります。

 [ServiceContract]
public interface IService1
{
    [OperationContract]
    void MyOperation1();
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession,ConcurrencyMode=ConcurrencyMode.Multiple)]
public class service1 : IService1
{
    public service1()
    {
        Console.WriteLine("creating instance");
    }
    public void MyOperation1()
    {
        Console.WriteLine("starting..");
        Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId);
        Thread.Sleep(1000);
        Console.WriteLine("Ending..");
    }
}

私のクライアントコードは次のようになります:

static void Main(string[] args)
    {
        Thread[] t = new Thread[10];
        NetTcpBinding myBinding = new NetTcpBinding();
        EndpointAddress myEndpoint = new EndpointAddress("net.tcp://localhost:8000/MyService");
        ChannelFactory<IService1> myChannelFactory = new ChannelFactory<IService1>(myBinding, myEndpoint);
        IService1 instance = myChannelFactory.CreateChannel();
        for (int i = 0; i < 10; i++)
        {
            t[i] = new Thread(new ThreadStart(delegate() 
            {
                instance.MyOperation1();
            }));
        }
        for (int i = 0; i < 10; i++)
        {
            t[i].Start();
        }          
    }

出力を取得しています(呼び出しが1つずつ実行されます):

creating instance
starting..
3
Ending..
starting..
3
Ending..
starting..
12
Ending..
starting..
3
Ending..
starting..
12
Ending..
starting..
3
Ending..
starting..
12
Ending..
starting..
3
Ending..
starting..
12
Ending..
starting..
3
Ending..

次のように、すべての呼び出しが並行して開始されることを期待しています。

creating instance
starting..
starting..
starting..
starting..
3
Ending..
4
6
Ending..
4

1 に答える 1

4

おそらく、単一のクライアント (チャネル) インスタンスを使用していることが原因です。

作成する新しいスレッドは、前のスレッドがチャネルを使用できるようになるまでチャネルを解放するのを待つ必要があります。

于 2013-08-06T19:42:45.543 に答える