wcf服务中的线程中止异常

本文关键字:异常 线程 服务 wcf | 更新日期: 2023-09-27 18:14:07

我有一个托管在IIS 6.0上的WCF服务(内置在。net框架3.5中)

代码流程如下

  1. 客户端(另一个web服务)调用WCF服务
  2. WCF服务调用线程在后台进行处理,并立即响应被调用者。
  3. 后台线程在完成所有处理后,回调该线程。这个调用基本上是HTTPs请求,因为客户端是web服务。

我正在对WCF服务进行负载测试,以定义阈值。观察结果如下:

1分钟内对WCF服务发出的1024个请求的3次迭代成功通过。完成每次迭代所花费的时间大约是25-30分钟。然而,从第4次迭代开始,可以看到大块故障。大约50%的请求失败,出现以下异常:

异常-线程被中止。

堆栈跟踪
21_10_2016_09_30_52,9:30:52 AM,Information,Thread name- apSwTTbLTETfwT3y Stack trace in ProcessTestConversion method -    at System.Threading.WaitHandle.WaitOneNative(SafeHandle waitableSafeHandle, UInt32 millisecondsTimeout, Boolean hasThreadAffinity, Boolean exitContext)
   at System.Threading.WaitHandle.InternalWaitOne(SafeHandle waitableSafeHandle, Int64 millisecondsTimeout, Boolean hasThreadAffinity, Boolean exitContext)
   at System.Threading.WaitHandle.WaitOne(Int32 millisecondsTimeout, Boolean exitContext)
   at System.Net.LazyAsyncResult.WaitForCompletion(Boolean snap)
   at System.Net.Connection.SubmitRequest(HttpWebRequest request, Boolean forcedsubmit)
   at System.Net.ServicePoint.SubmitRequest(HttpWebRequest request, String connName)
   at System.Net.HttpWebRequest.SubmitRequest(ServicePoint servicePoint)
   at System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)
   at System.Net.HttpWebRequest.GetRequestStream()
   .
   .(My function calls stack trace)
   .
   .

我试图解决这个问题的改变如下:

   <behavior>
    <serviceThrottling maxConcurrentCalls="2000"
                                 maxConcurrentInstances ="2400"
                                 maxConcurrentSessions ="400"/>
    </behavior>
在web . config中

<system.web>
        <compilation debug="false" />
        <httpRuntime executionTimeout="1800"/>
    </system.web>
在web . config中

  <system.net>
        <connectionManagement>
          <add address = "*" maxconnection = "100" />
        </connectionManagement>
      </system.net>
在web . config中

ServicePointManager.DefaultConnectionLimit = 100; (Change in code)

我已经将应用池的IdleTimeout属性设置为0,正如许多人在StackOverflow上建议的那样。

无论在哪里使用流,我都在所有的地方处理。所以所有的流都关闭了。

谁能告诉我是谁中止了线程,为什么中止,有没有办法或工具来追踪线程中止启动的原因?

wcf服务中的线程中止异常

我遇到过这个问题,这是由于客户端类的使用不当。

发生的事情是,当客户端类被实例化时,它不会释放资源,从而导致吞吐量降低。会出现一个非常无用的异常"线程被中止"。这个问题可以通过创建一个helper类来解决,该类泛型创建了一个客户端对象,然后正确地实现了构造函数和dispose方法。

一些IIS异常对问题的实际原因不是很有帮助或真实,但是为了解决我的问题而做的事情是查看IIS日志。特别是"失败请求跟踪规则"

希望这对你有帮助,我能理解你的沮丧,这是一个头痛的解决

我以前有过同样的脸。解决方案是通过实现Dispose方法在范围结束后释放资源/客户端。

问题存在,因为c# using语句在使用类型化客户端时自动清理资源是不成功的,并且任何抛出的异常都被隐式dispose掩盖,而隐式dispose会吃掉实际的异常&抛出一些其他异常,如超时或其他异常。

c#的"using"语句导致调用Dispose()。这与Close()相同,后者可能在发生网络错误时抛出异常。因为对Dispose()的调用隐式地发生在"using"块的右括号处,所以编写代码和阅读代码的人很可能不会注意到这个异常来源。这代表了应用程序错误的潜在来源。(从MSDN)

你应该释放资源,如:

try
{
    ...
    client.Close();
}
catch (CommunicationException e)
{
    ...
    client.Abort();
}
catch (TimeoutException e)
{
    ...
    client.Abort();
}
catch (Exception e)
{
    ...
    client.Abort();
    throw;
}

这样不仅可以找到异常的实际来源;还可以在发生异常时释放资源。

其他替代解决方案可以实现Dispose,如:

/// <summary>
/// Calculator Client
/// </summary>
public partial class CalculatorClient : IDisposable
{
    #region IDisposable implementation
    /// <summary>
    /// IDisposable.Dispose implementation, calls Dispose(true).
    /// </summary>
    void IDisposable.Dispose()
    {
        Dispose(true);
    }
    /// <summary>
    /// Dispose worker method. Handles graceful shutdown of the
    /// client even if it is an faulted state.
    /// </summary>
    /// <param name="disposing">Are we disposing (alternative
    /// is to be finalizing)</param>
    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            try
            {
                if (State != CommunicationState.Faulted)
                {
                    Close();
                }
            }
            finally
            {
                if (State != CommunicationState.Closed)
                {
                    Abort();
                }
            }
        }
    }
    /// <summary>
    /// Finalizer.
    /// </summary>
    CalculatorClient()
    {
        Dispose(false);
    }
    #endregion
}

:

Using语句避免问题MSDN

使用和处置WCF客户端