2012-03-26 37 views
2

此刻,我得工作:如何將參數和方法一起發送到新線程?

public void logowanie() 
{ 
int x=5,y=5; 
... 
} 

private void button2_Click(object sender, EventArgs e) 
     { 
      Thread thread2 = new Thread(new ThreadStart(logowanie)); 
      thread2.Start(); 
      //logowanie("xd", "xd", "xd"); 

     } 

這工作。是否有可能使類似

public int logowanie(int x, int y) 
{ 
... 
} 

private void button2_Click(object sender, EventArgs e) 
     { 
      Thread thread2 = new Thread(new ThreadStart(logowanie(5,5))); 
      thread2.Start(); 
      //logowanie("xd", "xd", "xd"); 

     } 

我剛剛開始線程的東西。謝謝

回答

5

雖然你使用ParameterizedThreadStart,我可能只是使用lambda表達式:

private void button2_Click(object sender, EventArgs e) 
{ 
    Thread thread2 = new Thread(() => logowanie(5, 5)); 
    thread2.Start(); 
} 

請注意,如果你把這種在一個循環中,你需要小心的,因爲變量是由lambda表達式捕獲的方式:

// Broken (before C# 5) 
foreach (string url in urls) 
{ 
    new Thread(() => CrawlUrl(url)); 
} 

// Fixed 
foreach (string url in urls) 
{ 
    string copy = url; 
    new Thread(() => CrawlUrl(copy)); 
} 

這只是一個問題,在某些情況下,您需要捕獲變量並確實想要捕獲當前值,但值得了解。

+0

+1呵呵,這很好:-)沒有意識到你可以做到這一點。 – 2012-03-26 14:08:48

+0

謝謝,最簡單快捷的方法! :) – Patryk 2012-03-26 14:14:50

0

創建一個新的類或結構。通過並施放它。

+0

那麼,他要知道*如何通過它,所以這個答案有點含糊,你不覺得嗎? – 2012-03-26 14:07:28

2

您可以使用ParameterizedThreadStart和傳遞對象的線程:

class ParametersForThread 
{ 
    public int x; 
    public int y; 
} 

... 

Thread thread2 = new Thread(new ParameterizedThreadStart(logowanie)); 
thread2.Start(new ParametersForThread() { x = 5, y = 5 }); 

你的線程方法必須看起來像

void logowanie(object state) 
{ 
    ParametersForThread parameters = state as ParametersForThread; 
    ....; 
} 
+0

似乎很多工作,當一個匿名函數會爲你做正確的事情:) – 2012-03-26 14:08:54

+0

是的,我寫了一個評論你的答案。但實際上,如果你想使用'ParametersForThread'類來返回一個結果 - 或者(如果不使用任務),那麼這個方法是非常靈活的,你會怎麼做? – 2012-03-26 14:10:55

0

使用委託。您可以定義自己的或使用一個內置的通用型的人喜歡行動,行動(T),或在你的情況行動(T1,T2)

private Action<int,int> myLoggingDelegate; 


private void button2_Click(object sender, EventArgs e) 
{ 
    myLoggingDelegate = logowanie; 
    myLoggingDelegate.BeginInvoke(myParam1,myParam2,Callback,null); //this is aynchronous 
} 

private void Callback(IAsyncResult ar) 
{ 
    myLoggingDelegate.EndInvoke(ar); 
} 
0

或者你可以使用內聯代碼,參數會自動傳遞給新線程。

void method() 
{ 
    int a = 5, b = 6; 
    Thread t = new Thread(delegate() 
    { 
     CallOtherMethodOnTheNewThread(a, b); 
    }); 
    t.Start(); 
} 
0

步驟1:創建一個類到單個對象上的參數結合:

private class ThreadParams { 
    public int X { get; set; } 
    public int Y { get; set; } 
    public ThreadParams(int x, int y) 
    { 
    this.X = x; 
    this.Y = y; 
    } 
} 

步驟2:聲明對你的方法此目的:

public void logowanie(ThreadParams param) 
{ 
... 
} 

步驟3:發送使用ParameterizedThreadStart的值:

Thread thread = new Thread(new ParameterizedThreadStart(logowanie)); 
ThreadParams prm = new ThreadParams(5,5); 
thread.Start(prm); 
相關問題