2012-05-19 127 views
13

任何人都可以給我一個關於線程主題的頭馬?我想我知道如何做一些事情,但我需要知道如何做到以下幾點:C#線程 - 如何啓動和停止線程

設置一個主線程,它會一直保持活動狀態,直到我發出信號停止(如果您想知道,它會在數據被接收)。然後我想要第二個線程開始,它將捕獲來自文本框的數據,並且當我發信號給用戶按下回車鍵時發生的信號時,它應該退出。

乾杯!

+0

只使用一個while循環另一個線程上,直到它接收數據 –

+0

啓動一個線程是很容易的。停止一個是非常困難的。專注於停止。 –

+1

您可能會考慮使用BackgroundWorker。它具有線程安全的事件回調,如果您需要操作表單/控件組件,則它非常方便。 – climbage

回答

16

這是我要做的事......

public class ThreadA { 
    public ThreadA(object[] args) { 
     ... 
    } 
    public void Run() { 
     while (true) { 
      Thread.sleep(1000); // wait 1 second for something to happen. 
      doStuff(); 
      if(conditionToExitReceived) // what im waiting for... 
       break; 
     } 
     //perform cleanup if there is any... 
    } 
} 

然後在自己的線程運行這個...(我做這種方式,因爲我也想送參數傳遞給線程)

private void FireThread(){ 
    Thread thread = new Thread(new ThreadStart(this.startThread)); 
    thread.start(); 
} 
private void (startThread){ 
    new ThreadA(args).Run(); 
} 

線程通過調用創建「FireThread()」

新創建的線程將運行,直到其條件爲s頂部被滿足,那麼它死......

可以發出信號「主」與代表,告訴它當線程已經死亡..所以你就可以開始第二個...

最佳要通讀:This MSDN Article

+0

請注意,這種方法創造了展示和實際做東西之間長達一秒的時差的機會。不一定不好,取決於你的要求。我現在正在搜索如何使用EventWaitHandle進行跨進程/線程信號的最佳使用後臺工作線程,但後來我有好運控制這兩個進程(東西生成器和東西)。這應該消除任何投票延遲。 –

5
Thread th = new Thread(function1); 
th.Start(); 
th.Abort(); 

void function1(){ 
//code here 
} 
+12

我覺得'Abort()'應該是最後一招。最好設置一個標誌並讓線程正常停止。 – climbage

+9

-1:我很抱歉,但'Thread.Abort'幾乎不會做它的方式。一個帶'ManualResetEvent'的循環 - 甚至是一個易變的布爾標誌 - 將會是一個更安全的方法。 – Douglas

4

在生成的線程中使用靜態AutoResetEvent使用Set()方法回調主線程。這傢伙在如何使用它有一個相當不錯的演示。

AutoResetEvent clarification