如何并行地从WCF客户端到WCF服务进行异步调用

时间:2013-08-21 22:31:34

标签: c# wcf throttling

我正在编写一个服务,该服务的运行时间相对较长。客户端需要能够进行彼此并行运行的连续请求,并且由于某种原因,我的服务不会同时执行它们,除非从不同的客户端执行调用。我正在试图找出我缺少的配置设置。

我正在使用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..
}
}

在客户端,我正在进行两次连续的异步调用:

openProxy();

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

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

在服务上,第二个操作仅在第一个操作结束后才开始。但是,如果我从不同的客户端执行两个调用,它们都由服务同时执行。

我错过了什么?我假设通过将我的服务类标记为“PerCall”,调用1和调用2,每个将接收自己的InstanceContext,因此在不同的线程上并发执行。

1 个答案:

答案 0 :(得分: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);