gpt4 book ai didi

c# - 在线程上启动多个服务

转载 作者:太空狗 更新时间:2023-10-29 23:09:09 25 4
gpt4 key购买 nike

我试图在一个线程上(在后台)打开一个代理,该线程创建一个新的代理实例,调用服务的一个方法,并在处理服务后立即执行。

所有这些都发生在一个线程上:

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 的超时设置为最大值,我仍然看到间歇性超时问题发生。

我只是想确保设计明智这不是问题,即在线程上打开服务并处理它?<​​/p>

编辑:

Proxy 在内部为每个线程在不同端点上建立自定义绑定(bind) channel 。

最佳答案

我认为问题可能在于您没有正确关闭代理。如果您有很多线程访问服务器并且它们没有全部自行清理,您可能会在这些连接上遇到一些超时。

Dispose 不是关闭连接的理想选择。更多信息:Disposing proxies

理想的使用模式如下:

try
{
proxy.Close();
}
catch (Exception ex)
{
proxy.Abort();
}
finally
{
proxy = null;
}

您尝试关闭连接,如果失败,您将中止所有连接。如果出现异常,Dispose 不会中止。

因此,我会这样重构:

var background = new Thread(() =>
{
var proxy = new AssignmentSvcProxy(new EndpointAddress(worker.Address));

try
{
proxy.Channel.StartWork(workload);
}
catch (Exception ex)
{
// You aren't doing anything special with your specific exception types
logService.Error(ex);
}
finally
{
try
{
proxy.Close();
}
catch (Exception ex)
{
proxy.Abort();
}
finally
{
proxy = null;
}
}

}) { IsBackground = true };

background.Start();

关于c# - 在线程上启动多个服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12977580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com