2012-05-19 18 views
13

誰も私にスレッドのトピックについて頭を悩ませることはできますか?C#スレッド - スレッドを開始および停止する方法

私はそれを止めるように通知するまでアクティブになるメインスレッドをセットアップします(あなたが不思議な場合にはデータが終わったときに終了します)受信される)。次に、私はテキストボックスからデータをキャプチャし、ユーザーがEnterキーを押したときに発生することを通知するときに終了する必要があります2番目のスレッドを開始します。

乾杯!

+0

それがデータを受信するまで、単に他のスレッドにwhileループを使用し –

+0

スレッドを起動することは非常に簡単です。 1つを停止することは非常に難しいです。停止に焦点を当てる。 –

+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までその状態になるまで実行されますトップは

...あなたは2番目の1を開始することができますので、あなたが..スレッドが死亡したときにそれを伝えるために、代表団との「メイン」を知らせることができる最高の出会い、それは死ぬ...

ですThis MSDN Article

+0

このアプローチでは、見た目と実際に作業を行うまでの間に、1秒間の遅れが生じる可能性があることに注意してください。必ずしも悪いわけではありません、あなたの要件に依存します。私は現在、クロスプロセス/スレッドシグナリングのために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