在线程上启动多个服务

Mur*_*dvi 5 c# wcf multithreading socket-timeout-exception

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

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

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();
Run Code Online (Sandbox Code Playgroud)

即使我已将CloseTimeout,OpenTimeout,ReceiveTimeout,SendTimeout的超时设置为max,我仍然会看到间歇性的超时问题.

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

编辑:

代理在内部为每个线程在不同端点上建立一个具有自定义绑定的通道.

Bar*_*dia 6

我认为问题可能在于您没有正确关闭代理.如果您有很多线程命中服务器并且它们并非全部清理完毕,那么您可能会在这些连接上获得一些超时.

处理不是关闭连接的理想选择.更多信息:处理代理

理想的使用方式如下:

try
{
    proxy.Close();
}
catch (Exception ex)
{
    proxy.Abort();
}
finally
{
    proxy = null;
}
Run Code Online (Sandbox Code Playgroud)

您尝试关闭连接,如果失败,则中止所有连接.如果有异常,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();
Run Code Online (Sandbox Code Playgroud)