[英]Thread aborted exceptions in wcf service
我有一個托管在IIS 6.0上的WCF服務(內置於.NET framework 3.5)。
代碼流程如下
我正在加載測試我的WCF服務以定義閾值。 觀察結果如下:
在1分鍾內對WCF服務進行的大約3次迭代的1024次請求成功通過。 完成每次迭代所需的時間約為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)
我已經按照StackOverflow上的許多人的建議將App池的IdleTimeout屬性設置為0。
無論在哪里使用溪流,我都會處理所有地方。 所以所有的流都關閉了。
任何人都可以告訴我誰在中止線程以及為什么有任何手段或工具來跟蹤線程中止啟動的原因?
我遇到過這個問題,這是由於客戶端類的使用不當。
發生的事情是當客戶端類被實例化時,它不會釋放資源導致吞吐量降低。 將發生一個非常無益的異常“線程被中止”。 這是通過創建一個輔助類來解決的,該類通用地創建了一個客戶端對象,然后正確地實現了構造函數和dispose方法。
某些IIS異常對問題的實際原因不是很有幫助或真實,但要了解解決我的問題所做的工作是查看IIS日志。 特別是“ 失敗的請求跟蹤規則 ”
希望這會有所幫助,我可以理解你的挫敗感,這是一個令人頭疼的問題。
我之前有同樣的事情。 解決方案是通過實現Dispose方法在其范圍結束后釋放資源/客戶端。
問題存在,因為C# using
語句在使用類型化客戶端時自動清理資源不成功,並且拋出的任何異常都被隱式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
}
資料來源 :
避免使用語句 MSDN的問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.