2012-07-24 161 views
1

我需要解析一個對象到另一個對象。我知道我必須把c傳給t1。如何做到這一點c#多線程,傳遞對象到另一個對象

Thread t = new Thread(t1); 
t.Start(); 

private static void t1(Class1 c) 
     { 
      while (c.process_done == false) 
      { 
       Console.Write("."); 
       Thread.Sleep(1000); 
      } 
     } 
+0

參數化的ThreadStart – 2012-07-24 22:28:49

+2

糟糕,這個對象也在線程之外使用嗎?那麼你必須鎖定它! – 2012-07-24 22:32:34

+0

跟進:如果你有你正在尋找的答案,不要忘記標記爲正確。問候。 – 2012-07-28 05:34:08

回答

3

好吧,大家都缺少對象在線程外使用的點。這樣,它必須同步以避免跨線程異常。

所以,解決辦法是這樣的:

//This is your MAIN thread 
Thread t = new Thread(new ParameterizedThreadStart(t1)); 
t.Start(new Class1()); 
//... 
lock(c) 
{ 
    c.magic_is_done = true; 
} 
//... 

public static void t1(Class1 c) 
{ 
    //this is your SECOND thread 
    bool stop = false; 
    do 
    { 
    Console.Write("."); 
    Thread.Sleep(1000); 

    lock(c) 
    { 
     stop = c.magic_is_done; 
    } 
    while(!stop) 
    } 
} 

希望這有助於。

Regards

+0

對我來說,問題更多的是關於對象到新線程的實際傳遞,但是您提出了一個很有用的觀點。 +1 – 2012-07-24 23:03:22

+0

有點解釋=)請注意,OP使用該對象作爲停止線程的標誌。 +1代碼,以及 – 2012-07-24 23:07:36

3

你可以簡單地做:

Thread t = new Thread(new ParameterizedThreadStart(t1)); 
t.Start(new Class1()); 

public static void t1(object c) 
{ 
    Class1 class1 = (Class1)c; 
    ... 
} 

MSDN:ParameterizedThreadStart Delegate


甚至更​​好:

Thread thread = new Thread(() => t1(new Class1())); 

public static void t1(Class1 c) 
{ 
    // no need to cast the object here. 
    ... 
} 

這種方法允許多個參數,並沒有t要求您將對象轉換爲所需的類/結構。

2
private static void DoSomething() 
{ 
    Class1 whatYouWant = new Class1(); 
    Thread thread = new Thread(DoSomethingAsync); 
    thread.Start(whatYouWant); 
} 

private static void DoSomethingAsync(object parameter) 
{ 
    Class1 whatYouWant = parameter as Class1; 
} 
相關問題