【发布时间】:2012-10-19 15:30:16
【问题描述】:
我正在尝试在线程上(在后台)打开代理,该线程创建代理的新实例,调用服务的方法并立即处理服务。
所有这些都发生在一个线程上:
var background = new Thread(() =>
{
var proxy = new AssignmentSvcProxy(new EndpointAddress(worker.Address));
try
{
proxy.Channel.StartWork(workload);
proxy.Dispose();
}
catch (EndpointNotFoundException ex)
{
logService.Error(ex);
proxy.Dispose();
proxy = null;
}
catch (CommunicationException ex)
{
logService.Error(ex);
proxy.Dispose();
proxy = null;
}
catch (TimeoutException ex)
{
logService.Error(ex);
proxy.Dispose();
proxy = null;
}
catch (Exception ex)
{
logService.Error(ex);
proxy.Dispose();
proxy = null;
}
}) { IsBackground = true };
background.Start();
即使我已将 CloseTimeout、OpenTimeout、ReceiveTimeout、SendTimeout 的超时设置为最大值,我仍然会看到间歇性超时问题。
我只是想确保设计明智这不是问题,即在线程上打开服务并处理它?
编辑:
代理在内部为每个线程在不同端点上建立一个自定义绑定的通道。
【问题讨论】:
-
您在我期望“代理”(甚至“客户端”)的地方谈到“服务”有点令人困惑,例如“线程打开服务”应该是“线程为我的服务打开代理”吧?
-
对不起,我刚刚更新了这个问题,所以基本上我的服务已经打开了,但是代理只是调用了 proxy.Channel.StartWork(workload);那个特定的服务(已经是自托管的)——有意义吗?
-
您可能希望在 try-catch 子句中添加
finally。即使抛出异常,finally 也会执行代码。关于你的问题,我不确定。我也相信将绑定传递给构造函数是明智的。这可能是您的超时异常的原因。 -
你启动了多少这些线程?还是只有这个?
-
为什么要给自己纺线?我会选择异步方法或 TPL
标签: c# multithreading wcf socket-timeout-exception