2012-07-09 62 views
0

我想在其堆棧大小增加到10.000.000的另一個線程中運行遞歸函數「hueckel_operator()」。 首先,當我點擊檢測邊緣按鈕時調用hueckel_operator。所以我一直在detect_edges_click()函數創建新的線程爲當嘗試啓動一個進程時發生ThreadStateException

private void detect_edges_Click(object sender, EventArgs e) 
     { 
      var stackSize = 20000000; 
      Thread workerThread = new Thread(new ThreadStart(hueckel_operator), stackSize);       
       workerThread.Start(); 

     } 

public void hueckel_operator(int counter4, int counter5) 
{ 

} 

,但我得到一個錯誤「錯誤22沒有重載‘hueckel_operator’匹配委託‘System.Threading.ThreadStart’」

在哪我可以創建一個新的線程來執行我的遞歸函數嗎?

而不是創建一個新的線程,我應該更好地增加我的主線程的堆棧大小?

還是我說的完全是廢話,我應該繼續閱讀更多關於線程?

在此先感謝

回答

3

MSDN of ThreadStart,我們可以看到,委託的簽名是:

public delegate void ThreadStart() 

,你的方法不尊重,因爲它需要兩個參數。

如果你想通過你可以使用ParameterizedThreadStart參數,但你仍然需要更改方法簽名接受一個單一object參數:

public void hueckel_operator(object param) 
{ 
} 

然後,您可以封裝在一個自定義類型你的兩個int參數:

class ThreadParameter 
{ 
    public int I { get; set; } 
    public int J { get; set; } 
} 
+0

我已經做了所有的事情,如你所說,沒有錯誤,但hueckel_operator()在每次counter4和counter5增加5在這種情況下,我應該以某種方式將counter4和counter5分配給param。但我不知道該怎麼做 – mctuna 2012-07-09 16:46:11

+0

@mrtcn:我建議你用兩個int成員定義一個自定義類型,並用它來傳遞參數。我用一個例子編輯了我的答案。 – Tudor 2012-07-09 16:48:55

0

我認爲,你在呼喚你的新線程的方式並不期望接收的功能的任何參數,因此無法找到你的函數。如果你想傳遞參數給你的新線程,你應該使用一個對象數組並將其傳遞給函數。

2

您可能想要使用new ParameterizedThreadStart(hueckel_operator)以保證安全,然後讓workerThread.Start();將參數傳遞給數組或列表。

+0

您是否也指對象參數?'我也創建了一個值爲{1,1}的數組。我應該把這個數組放在像hueckel_operator(parameterArray)這樣的參數中嗎? – mctuna 2012-07-09 16:49:29

+0

@mrtcn,是的,paramterArray會起作用。實際上,任何種類的IEnumerable都可以工作,包括列表,字典,當然還有數組。即使是一個單獨的班級或結構也可以工作(如果你只有一個參數,你可以將它作爲自己的方式傳遞給一個數組)。 – 2012-07-09 16:52:21

0

這是因爲ThreadStart代表應該沒有參數,但您的功能hueckel_operator需要兩個。

要將參數傳遞到您的線程功能,只需使用lambda表達式,像這樣把它傳遞給線程構造函數:

public static void parametrized(int one, int two) 
{ 
    //perform computation 
} 

然後將它傳遞給Thread構造函數包裹在一個lambda表達式:

int arg1 = 4; 
int arg2 = 2; 
Thread t = new Thread(new ThreadStart(() => parametrized(arg1, arg2))); 

表達式() => parametrized(arg1, arg2)創建了一個不帶參數的匿名函數(就像我們的Thread期望的那樣),然後通過提供的參數簡單地調用我們實際上想從它的主體調用的函數。

相關問題