2010-07-20 71 views
8

標題幾乎說明了它。我有一些需要在新線程上運行的方法,並且因爲在創建線程之前所有的代碼都差不多,所以我想創建一個函數,該函數可以將我需要調用的Action作爲參數。如何創建一個新的線程來執行一個動作<T>

問題是,我還沒有找到如何告訴線程它需要執行該操作。這甚至有可能嗎?以下是我想要做的一些示例代碼。

private void ExecuteInBiggerStackThread(Action<Helper> action, Parameters parms) 
{ 
    ParameterizedThreadStart operation = new ParameterizedThreadStart(action);// here's the mess 
    Thread bigStackThread = new Thread(operation, 1024 * 1024); 

    bigStackThread.Start(parms); 
    bigStackThread.Join(); 
} 

問候,
西巴

+0

堆棧不大。它在x64上實際上更小。 – 2010-07-20 14:51:15

+0

該代碼在IIS 7上運行:) – sebagomez 2010-07-20 14:53:33

回答

7

像這樣的東西應該做的伎倆:

private void ExecuteInBiggerStackThread(Action<Helper> action, Helper h) 
{ 
    var operation = new ParameterizedThreadStart(obj => action((Helper)obj)); 
    Thread bigStackThread = new Thread(operation, 1024 * 1024); 

    bigStackThread.Start(h); 
    bigStackThread.Join(); 
} 
0

嘗試使用Action<object>,然後轉換爲Helper在動作的身體

8

我不會甚至不打擾ParameterizedThreadStart。讓編譯器做骯髒的工作:

private void ExecuteInBiggerStackThread(Action<Helper> action, Helper h) 
{ 
    Thread bigStackThread = new Thread(() => action(h), 1024 * 1024); 

    bigStackThread.Start(); 
    bigStackThread.Join(); 
} 

當然,你可以攜帶此基礎上更進一步,並簽名改爲:

private void ExecuteInBiggerStackThread(Action action) { ... } 
3

或方法的更寬泛的版本....

protected void ExecuteInBiggerStackThread<T>(Action<T> action, T parameterObject) 
{ 
    var bigStackThread = new Thread(() => action(parameterObject), 1024 * 1024); 
    bigStackThread.Start(); 
    bigStackThread.Join(); 
} 
相關問題