使用System.Timers.Timer做一個定時查詢,因為是呼叫第三方dll里的查詢介面,有時候介面不會回傳結果只能進行下一次查詢,導致Timer每次回圈查詢時都會產生一個執行緒不會被關掉,最后直接崩掉。有什么辦法解決嗎?
uj5u.com熱心網友回復:
{
private int processInProgress = 0;
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
if (System.Threading.Interlocked.CompareExchange(ref processInProgress, 1, 0) != 0)
{
System.Diagnostics.Debug.WriteLine("當前處理還未結束,忽略當下定時器事件。");
return;
}
try
{
// 這里寫你現在的處理例程
}
finally
{
Interlocked.Exchange(ref processInProgress, 0);
}
}
}
uj5u.com熱心網友回復:
如果Interlocked.CompareExchange不好理解,你也可以用一個鎖:{
private readonly object lockObj = new object();
private bool processInProgress = false;
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
lock(lockObj)
{
if (processInProgress)
{
System.Diagnostics.Debug.WriteLine("當前處理還在運行中,忽略當下定時器事件。");
return;
}
processInProgress = true;
}
try
{
// 這里寫你現在的處理例程
}
finally
{
lock (lockObj) processInProgress = false;
}
}
}
uj5u.com熱心網友回復:
你每次都是創建了一個執行緒嗎?可以試試執行緒池。uj5u.com熱心網友回復:
那處理的事情無法結束時,要怎么去關閉這個執行緒?我試了下System.Timers.Timer的Dispose()方法和Stop()方法后仍在運行。
uj5u.com熱心網友回復:
我不建議“關閉這個執行緒”,強制關閉可能造成資源泄露或死鎖等問題。
uj5u.com熱心網友回復:
弄個公共變數記錄回圈次數,再加個鎖。達到回圈數不再回圈。uj5u.com熱心網友回復:
從業務處理流程入手才是根本。查詢超時,得去分析超時的原因,
1. 如果是查詢資料量過大超時,那么得優化業務處理流程
或者分時間段或者分不同的約束條件,避免超時
2. 如果是第三方dll的問題,得和dll提供者進行技術溝通,
明確呼叫的邊界條件。
如果dll的呼叫是同步方式,可以要求dll的提供者提供異步呼叫的介面
uj5u.com熱心網友回復:
用Interlocked的Increment/decrement 判斷是不是=0也可以uj5u.com熱心網友回復:
我懷疑是dll里面的問題,導致執行緒不能退出,只能手動new一個thread,然后超時強制結束執行緒,不然執行緒池都會被它耗光轉載請註明出處,本文鏈接:https://www.uj5u.com/net/71671.html
標籤:C#
