5

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

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

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

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

编辑 :

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

4

1 回答 1

6

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

Dispose 不适合关闭连接。更多信息在这里:处理代理

使用的理想模式如下:

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();
于 2012-11-06T19:06:35.973 回答