2012-06-22 58 views
0

讓我描述一下我試圖實現的目標。我正在用C#編程。C#背景線程

我有一個函數(方法)DoCalculations()。我想遞歸地調用這個DoCalculations()方法。但是,在C#中,我得到異常作爲未處理的異常System.StackOverflow。 所以,我試圖在背地面線程上運行DoCalculations()方法。

在FORM LOAD事件上。我做了以下事情: -

Thread objThread = new Thread(new ThreadStart(DoCalculations)); 

在開始按鈕單擊事件。我正在啓動線程如下。

objThread.IsBackground = true; 
    objThread.Start(); 
    while (!objThread.IsAlive) 
    { 
    } 

而且我打算用上面的While循環連續運行方法DoCalculations()。

DoCalculations() 
{ 
//some calculations. 

} 

我在DoCalculations()方法中獲得了一次控制權。但是,我想每一次都這樣做。

如果有人能夠幫助我關於背地線,還是有什麼更好的方法來實現並行計算。

我已經在上面VB.NET方法使用,使我更加困惑,爲什麼它不是在C#.NET

任何援助工作,意見極大的讚賞。

感謝 AP

+0

你是什麼意思 - 「我確實在DoCalculations()方法中控制一次」? –

+2

爲什麼不嘗試修復堆棧溢出異常? – Lee

+0

「我想遞歸地調用這個DoCalculations()方法。」 - DoCalculations'自稱嗎?你確定終止條件是正確的嗎? – forsvarir

回答

0

如果你想在後臺線程repeadetly運行它,你可以使用System.Threading.Timer類是這樣的:

var timer = new Timer(DoCalculations, null, TimeSpan.FromSeconds(0), TimeSpan.FromSeconds(1)); 

這將運行caclulations每一秒。如果要調整時間,請更改最後的TimeSpan參數。

0

如果你得到一個堆棧溢出異常,順便把它趕走會通過引入多線程被發現。遞歸代碼中存在一個錯誤。

+0

也許他有方法在最後調用它自己以使它一遍又一遍地被調用。不幸的是,這也會導致他的堆棧溢出。 –

+0

同意。無論它是在相同的線程還是在不同的線程中執行。這是我的觀點。 – PeteH

+0

然後我們同意:) –

1

System.Threading.Timer提供了一種機制,以指定的時間間隔執行方法。

如何在你的情況下使用....

using System.Threading; 

聲明定時器的回調和定時器對象如下..

private TimerCallback calculateTimerDelegate = null; 
private System.Threading.Timer calculationTimer = null; 

而在你的load()事件初始化它們...

calculateTimerDelegate = new TimerCallback(DoCalculation); 
calculationTimer = new Timer(calculateTimerDelegate , null, 10000, (1 * 60 * 1000)); 

現在,你的方法c alculation ....

DoCalculations() 
{ 
    //some calculations. 
} 
3

首先,使用後臺工作,因爲它更容易使用,速度更快。

其次,你的循環代碼應該在後臺線程中。

下面是一些讓你開始的代碼。

BackgroundWorker bw = new BackgroundWorker(); 
bw.DoWork += bw_DoWork; 
bw.RunWorkerAsync(); 

... 

private void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    while (someCondition) 
    { 
     DoCalculations(); 
    } 
} 

編輯:這聽起來像你只是想修復一個堆棧溢出,而不知道如何去做。忘記多線程,而不是遞歸調用DoCalculations,在循環中調用它,並確保循環知道何時終止。此外,如果您在此期間不想鎖定GUI,那麼後臺線程會更好。