WCFSuspendCall我有一个实现长轮询的WCF服务。但是,我看不到让每个服务调用在调用时都生成一个新线程的方法。目前,多头合约的合约正在等待事件发生并阻止调用任何其他合约。在WCF中从另一个合同异步运行一个合同的建议方法是什么?我想保留一个静态线程池,但我不太确定此解决方案是否可扩展。谢谢!在您的问题的上下文中,我假设长轮询是一种定期向第三方资源发出HTTP请求直到返回所需响应或超时的操作。要有效地实现它,您可以使用.NET4.5、TAP模式和异步/等待。示例(未测试)://contract[ServiceContract]publicinterfaceIService{//基于任务的异步模式[OperationContract]TaskDoLongPollingAsync(stringurl,intdelay,inttimeout);}//实现publicclassService:IService{publicasyncTaskDoLongPollingAsync(stringurl,intdelay,inttimeout){//通过CancellationTokenSourceusing(varcts=newCancellationTokenSource(timeout))using(varhttpClient=newSystem.Net.Http.HttpClient())using(cts.Token.Register(()=>httpClient.CancelPendingRequests())){try{while(true){//进行轮询迭代vardata=awaithttpClient.GetStringAsync(url).ConfigureAwait(假);if(data=="ENDPOLLING")//我们应该结束轮询吗?返回真;//在下一次轮询迭代之前暂停awaitTask.Delay(delay,cts.Token);}}catch(OperationCanceledException){//由于超时被取消?如果(!cts.IsCancellationRequested)抛出;}//超时抛出新的TimeoutExce选项();这很好地缩放,因为大部分时间DoLongPolling处于挂起状态,异步等待HttpClient.GetStringAsync或Task.Delay调用的结果,这意味着它不会阻止ThreadPool,因此WCF服务可以服务于更多DoLongPolling请求.查看StephenCleary的“NoThreads”,详细了解其背后的工作原理。在客户端,您还可以异步调用WCF服务。创建WCF服务代理并选择“生成基于任务的操作”时,勾选“允许生成异步操作”。如果您需要以.NET4.0为目标,您可以在JaliyaUdagedara的“WCF中的异步操作”中找到一些替代方案。以上就是C#学习教程:WCF挂起调用共享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
