如何并行地从WCF客户端对WCF服务进行异步调用
本文关键字:WCF 客户端 服务 调用 异步 何并行 并行 | 更新日期: 2023-09-27 18:28:29
我正在编写一个服务,该服务的调用运行时间相对较长。客户端需要能够发出相互并行运行的连续请求,出于某种原因,除非从单独的客户端执行调用,否则我的服务不会同时执行这些请求。我正试图弄清楚我缺少什么配置设置。
我正在使用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,从而在单独的线程上并发执行。
您需要使客户端调用异步。如果您使用的是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);