2010-02-12 54 views
5

我有這樣的代碼在C#:激活線程C#

Thread t1 = new Thread(functionsActivations(3, 4000, 0, 4)); 
Thread t2 = new Thread(functionsActivations(3, 4000, 5, 9)); 
t1.start(); 
t2.Start(); 
Thread t3 = new Thread(functionsActivations(4, 4000, 0, 4)); 
Thread t4 = new Thread(functionsActivations(4, 4000, 5, 9)); 

這是行不通的。我怎麼能告訴它調用我給它的方法? 其次,我想t3和t4在t1和t2完成運行後激活。我怎樣才能做到這一點? 第三,我希望t1和t2不會阻塞(這樣t2就不必等到t1結束)。我做的是對的嗎?

+0

哦,我不知道... – aharon 2010-02-12 13:14:23

+2

Yea隊友,2/11接受不好。仔細檢查這些問題,並將那些回答您的情況的問題標記爲已接受。 – 2010-02-12 13:15:46

回答

4

「這不起作用」並不是一組非常明顯的症狀。你在觀察什麼?

編輯:好的,現在你已經說過編譯器錯誤是什麼,它更容易診斷。您當前正在調用一個方法並嘗試將結果用作要執行的線程的任務。假設你實際上要作出這樣的方法調用,當線程啓動,你想是這樣的:

C#2:

Thread t1 = new Thread(delegate() { functionsActivations(3, 4000, 0, 4); }); 

C#3:

Thread t1 = new Thread(() => functionsActivations(3, 4000, 0, 4)); 

的altnerative到在所有地方有lambda表達式將是寫實用方法:

private static Action DeferFunctionActivations(int a, int b, int c, int d) 
{ 
    return() => functionsActivations(a, b, d, d); 
} 

然後,你可以使用:

Thread t1 = new Thread(DeferFunctionActivations(3, 4000, 0, 4)); 

對於帖子的餘下部分我假設C#3

此外,t1.start()應該是t1.Start() - C#是區分大小寫的。

要回答你的最後一點,t1t2目前是獨立的 - 它們不會互相阻塞,除非你在他們正在運行的代碼的某個地方進行了同步。

如果你只是想t3t4t1t2已經完成啓動,你可以使用Thread.Join

Thread t1 = new Thread(() => functionsActivations(3, 4000, 0, 4)); 
Thread t2 = new Thread(() => functionsActivations(3, 4000, 5, 9)); 
t1.Start(); 
t2.Start(); 
t1.Join(); 
t2.Join(); 
Thread t3 = new Thread(() => functionsActivations(4, 4000, 0, 4)); 
Thread t4 = new Thread(() => functionsActivations(4, 4000, 5, 9)); 
t3.Start(); 
t4.Start(); 

注意,這意味着線程將等到t1t2已經完成,太。如果這對你來說不夠好,有很多選擇,但基本上你會想要別的東西來異步等待t1和t2完成。例如,您可以了一個額外的線程來做到這一點:

Thread t1 = new Thread(() => functionsActivations(3, 4000, 0, 4)); 
Thread t2 = new Thread(() => functionsActivations(3, 4000, 5, 9)); 
t1.Start(); 
t2.Start(); 
Thread t3 = new Thread(() => functionsActivations(4, 4000, 0, 4)); 
Thread t4 = new Thread(() => functionsActivations(4, 4000, 5, 9)); 
Thread t5 = new Thread(() => 
{ 
    t1.Join(); 
    t2.Join(); 
    t3.Start(); 
    t4.Start(); 
}); 
t5.Start(); 

有點噁心,但它應該工作。

你能夠使用.NET 4.0嗎?如果是這樣的話,並行擴展框架使得這很容易。

+0

謝謝!你解決了我最後兩個問題,但不是第一個問題。 它不是由於其他原因而起作用,問題在於我給出的線程函數。它告訴我,他不能從void轉換到system.threading.threadstart ... – aharon 2010-02-12 13:24:23

+0

爲什麼你要傳遞一個構造函數給線程?你想做什麼?在線程中創建一個對象,因爲構建需要很長時間? – Dave 2010-02-12 13:33:29

+0

不,代碼是在ctor中,我通過線程 – aharon 2010-02-12 13:38:18