1

比較的長時間実行される呼び出しを持つサービスを作成しています。クライアントは、互いに並行して実行される連続したリクエストを作成できる必要があります。何らかの理由で、呼び出しが別々のクライアントから実行されない限り、私のサービスはそれらを同時に実行しません。不足している構成設定を見つけようとしています。

netTcpBinding を使用しています。私の調整構成は次のとおりです。

<serviceThrottling maxConcurrentInstances="10" maxConcurrentCalls="10" maxConcurrentSessions="10"/>

サービス契約:

[ServiceContract(CallbackContract=typeof(ICustomerServiceCallback))]
    public interface ICustomerService
    {
[OperationContract(IsOneWay = true)]
        void PrintCustomerHistory(string[] accountNumbers, 
            string destinationPath);
}

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]
    public class CustomerService : ICustomerService
    {

public void PrintCustomerHistory(string[] accountNumbers, 
            string destinationPath)
        {
//Do Stuff..
}
}

クライアントでは、2 つの連続した非同期呼び出しを行っています。

openProxy();

//call 1)
                proxy.PrintCustomerHistory(customerListOne, @"c:\DestinationOne\");

//call 2)
                proxy.PrintCustomerHistory(customerListTwo, @"c:\DestinationTwo\");

サービスでは、最初の操作が終了してから 2 番目の操作が開始されます。ただし、別々のクライアントから両方の呼び出しを実行すると、サービスによって両方が同時に実行されます。

私は何が欠けていますか?サービス クラスを「PerCall」としてマークすることで、呼び出し 1 と呼び出し 2 がそれぞれ独自の InstanceContext を受け取り、別々のスレッドで同時に実行されると想定していました。

4

1 に答える 1

2

クライアント呼び出しを非同期にする必要があります。VS 2012 を使用している場合は、サービス リファレンスでタスク ベースの非同期呼び出しを有効にしてから、次の方法で呼び出すことができます。

var task1 = proxy.PrintCustomerHistoryAsync(customerListOne, @"c:\DestinationOne\");
var task2 = proxy.PrintCustomerHistoryAsync(customerListTwo, @"c:\DestinationTwo\");

// The two tasks are running, if you need to wait until they're done:
await Task.WhenAll(task1, task2);
于 2013-08-21T22:35:56.047 に答える