首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理长时间运行的WCF [OperationContract(IsOneWay = true)]

处理长时间运行的WCF [OperationContract(IsOneWay = true)]
EN

Stack Overflow用户
提问于 2012-12-18 01:51:00
回答 4查看 1.6K关注 0票数 2

我使用了下面的服务,定义为OneWay,因为它是长时间运行的(几分钟),当它结束时我不能等待(它在ASP.NET应用程序中使用)。

问题是,如果我在服务调用之后调用client.Dispose(),它会阻塞,并且在60s超时后会出现异常。

在这种情况下,我应该如何处理客户端?增加服务的超时不是解决方案,因为我不能等待使用它的网页的HTTP请求这么长时间。

代码语言:javascript
复制
[ServiceContract]
public interface IMyService
{        
    [OperationContract(IsOneWay = true)]
    void BeginRun();
}

var client = new MyServiceClient();
client.BeginRun();
client.Close(); //This leads to time-out, how and when to call it?

谢谢你的建议。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-12-18 02:06:27

从你的签名来看,你似乎不需要任何形式的回复。在这种情况下,在服务上,当您收到BeginRun()调用时,在非WCF线程上执行工作。这将释放通道&应该允许您立即处理客户端。

尽管您已经将OperationContract标记为IsOneWay,但这并不意味着WCF会立即释放该通道。在从网络读取所有数据之前,WCF服务实际上不会从单向调用中返回。根据您的服务配置,这可能涉及等待之前的调用完成(特别是使用单并发模式会话服务配置)。

因此,出于几个原因,在独立于WCF线程的线程上实际执行服务工作通常是一个好主意,这将提高吞吐量。有关更多详细信息,请查看MSDN上的this article

票数 2
EN

Stack Overflow用户

发布于 2012-12-18 16:38:44

我会将您的绑定切换到netMsmqBinding。然后,从您的客户端,您的单向呼叫将是即时的。

通过http的长持续时间发送充其量是有问题的,并且管理起来很复杂。在两者之间插入一个队列将极大地简化此操作。

票数 3
EN

Stack Overflow用户

发布于 2012-12-18 02:09:14

您可以尝试IChannel方法。或者试试这个,不确定它会不会起作用:http://msdn.microsoft.com/en-us/library/ms731177.aspx

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13919364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档