2011-09-25 30 views
0

更新的web.config後bezerk我有一個Web應用程序,執行以下操作:IIS CPU進入與辛格爾頓一個C#應用程序與線程

你點擊一個按鈕來實例化一個單身,這將創建一個線程。該線程連續運行一些HTTP請求來收集一些數據。您可以單擊在線程上調用Abort()方法的停止按鈕,並且應用程序停止發出HTTP請求。當我手動啓動/停止時,一切正常。

當我「觸摸」web.config時,會出現我的問題。 CPU(w3wp.exe進程)峯值和網站停止響應。有人知道爲什麼會發生這種情況嗎?不應該更新web.config重置所有內容?

示例代碼如下:

private static MyProcessor mp = null; 
private Thread theThread = null; 
private string status = STOP; 
public static string STOP = "Stopped"; 
public static string START = "Started"; 

private MyProcessor() 
{} 

public static MyProcessor getInstance() 
{ 
    if (mp == null) 
    { 
     mp = new MyProcessor(); 
    } 
    return mp; 
} 

public void Start() 
{ 
    if (this.status == START) 
     return; 

    this.theThread = new Thread(new ThreadStart(this.StartThread)); 
    this.theThread.Start(); 
    this.status = START; 
} 

public void Stop() 
{ 
    if (this.theThread != null) 
     this.theThread.Abort(); 
    this.status = STOP; 
} 

private void StartThread() 
{ 
    do 
    { 
     try 
     { 
      //do some work with HTTP requests 
      Thread.Sleep(1000 * 2); 
     } 
     catch (Exception e) 
     { 
      //retry - work forever 
      this.StartThread(); 
     } 
    } while (this.status == START); 
} 

回答

2

我懷疑這就是問題所在:

private void StartThread() 
{ 
    do 
    { 
     try 
     { 
      //do some work with HTTP requests 
      Thread.Sleep(1000 * 2); 
     } 
     catch (Exception e) 
     { 
      //The recursive call here is suspect 
      //at the very least find a way to prevent infinite recursion 
      //--or rethink this strategy 
      this.StartThread(); 
     } 
    } while (this.status == START); 
} 

當你的應用程序域重置,你會得到一個ThreadAbort例外,這將在這裏捕捉並觸發一個遞歸調用,這將創下另一個異常,而另一個遞歸調用。它一直都是烏龜!

+0

謝謝,我評論了行重新調用線程和問題解決。顯然,我的一個糟糕的實施......現在是一個殺手問題:我的選擇是什麼?從本質上講,我試圖讓線程永遠......即使它拋出一些異常(例如HTTPException或類似的東西)。基本上,我不希望它每次都會停止,但肯定是在應用程序重置時。有什麼想法嗎? – domaa

+0

我最近設置了一些類似的情況,但採用了不同的方法。我有一個重新啓動線程阻塞在每次遇到異常時設置的特殊重新啓動事件,但沒有遞歸。將遞歸結構放入循環總是可能的,這就是我在這裏推薦的。如果您必須進行遞歸計算,請記下您使用靜態變量進行的呼叫次數,並設置一個故障安全號碼,超過該號碼您將不會進行遞歸調用。您還應該查找特定於AppDomain重置的異常,並避免在這些情況下發生遞歸。 –

+0

感謝您的建議 – domaa

0

是,使得網絡的.config重置應用程序的任何變化,asp.net重新構建應用程序。

對於Bin和App_Code文件夾下的文件等其他文件也是如此。

+0

謝謝,但是爲什麼w3wp.exe在我這樣做的時候去了bezerk? – domaa