2009-06-28 18 views
10

私は中止()...NETでスレッドを再起動

public partial class MyProgram : Form 
{ 
    private Thread MyThread = new Thread(MyFunction); 
    private System.Windows.Forms.Button startStopBtn = new System.Windows.Forms.Button(); 
    public MyProgram() 
    { 
    MyThread.Start(); 
    startStopBtn += new EventHandler(doStop); 
    startStopBtn.Text = "Stop"; 
    } 
    private static void MyFunction() 
    { 
    // do something 
    } 
    private void doStop(object sender, EventArgs e) 
    { 
    MyThread.Abort(); 
    startStopBtn -= new EventHandler(doStop); 
    startStopBtn += new EventHandler(doStart); 
    startStopBtn.Text = "Start"; 
    } 
    private void doStart(object sender, EventArgs e) 
    { 
    MyThread.Start(); // << Error returned when clicking the button for 2nd time 
    startStopBtn -= new EventHandler(doStart); 
    startStopBtn += new EventHandler(doStop); 
    startStopBtn.Text = "Stop"; 
    } 
} 

任意のアイデアによって停止されたスレッドを再起動する方法を探しています(C#を使用して)?

答えて

12

doStart()でMyThread.Start()を呼び出す前にMyThread = new Thread(MyFunction)を追加するだけです。あなたのメソッドの外にスレッドを作成しないでください。そこには宣言のためのスペースがあります。

編集:thread.Abort()でスレッドを強制終了すると非常に危険です。彼の記事で説明されているGrooのようなきれいなマルチスレッドを達成しようとするべきです。

+0

この回答は実際の回答よりも回避策です。 – Trap

+3

プログラミングの初心者のときにも同様の問題がいくつか起きていましたが、私はGrooのような多くのソリューションを読んでいました。はい、あなたは完全に正しいですが、私の解決策は回避策に過ぎません。しかし、プログラミングが新時代に理解するには、グルーオが説明するメカニズムが複雑すぎます。簡単な答えを提供する方が良いでしょう。回避策)は経験の豊富ではないプログラマーのために。 – Emiswelt

+0

これは悪いプログラマーを作るものです。彼らは彼らが何をしているのかを理解するのに十分な時間を投資しません。あなたのスレッドをきれいにするつもりです。あなたがいなくなったら混乱しますか? –

2

いいえ、ありませんが、どうしたいですか?新しいスレッドを、同じThreadStartを使って起動し、同じパラメータがあればそれを起動してください。

6

簡単な答えはできません。スレッドが中止されると、スレッドを再起動することはできません。スレッドオブジェクトを必要な方法で返すメソッドや何かを作成するだけです。新しいスレッドが必要な場合は、そのメソッドから取得してください。

29

スレッドを中断したら、もう一度スレッドを開始することはできません。

実際の問題は、があなたのスレッドを中止することです。あなたはnever use Thread.Abort()です。

スレッドを一時停止して何度も実行する必要がある場合は、他のメカニズム(たとえばAutoResetEventなど)の使用を検討する必要があります。

[EDIT]

上記のリンクにIan Griffithsで述べたように、スレッドを中止するための最も簡単な解決策、次のとおりです。

私はいつもお勧めのアプローチが死んで簡単です。 volatile boolフィールドはワーカースレッドとUIスレッドの両方に表示されます。ユーザーがキャンセルをクリックすると、に設定されます。一方、あなたのワーカースレッドでは、テスト時々フラグ。それがセットになったら、あなたがやっていることをやめてください。あなたはそれを正しく動作させるために必要

唯一のものは、それがループでを実行されるように、あなたのバックグラウンド方法を再配置することである - あなたのフラグがで設定されている場合は、定期的にチェックできるように、別のスレッド。

単純なvolatile boolフラグアプローチではなく、同じワーカースレッドに対して機能を一時停止してから再開する必要がある場合、少し複雑なアプローチ、つまりAutoResetEventなどの同期構造に進むことができます。これらのクラスは、ワーカースレッドを非ワーカースレッドからのシグナルの間の指定された(または不確定な)時間だけスリープ状態にする方法も提供します。

This threadには、Start、Pause、Resume、Stopの各メソッドが含まれています。 Brannonの例であるが決してでスレッドを異常終了することに注意してください。イベントを発生させ、スレッドが正常に終了するまで待ちます。

0

本当にスレッド機能を中断して再開する必要がある場合は、条件を設定し、処理中に定期的にチェックする必要があります。

これにより、処理を中断してから再開することができます。

同様のタスクを実行するためにイベントと待機を使用しました。

0

最も簡単な方法は、スレッドを中断しないことです。

-3

実際にプログラマがスレッドの処理を中断したり、中断したりしてコードを脆弱にする方法を教えてください。 。 @ Brad--メートル申し訳ありません..しかし、あなたのアイデアが良くありませんでした.. @Rhythmic - あなたは物事にアプローチするあなたの方法で作業する必要があります..あなたの人々が彼を同じように権利を得た場合

BFreeは多少ました彼は言ってみたかった... あなたはそれを再宣言する必要があります..

以下は例です:

Public Shared Sub ResetAbort() 

    Dim ThreadPleaseWait As New Thread(New ThreadStart(AddressOf YourSubName)) 

    YourThreadName.Start() 

    Thread.Sleep(2000) 

    YourThreadName.Abort() 

End Sub 

これで、スレッドを開始したい場所にこのSubを使用できます。自動的にスレッドを中止します。

あなたはのbutton1_Click()イベントでスレッドを開始し、Button2_Click()イベントこの使用でそれを停止したい場合は、次のbutton1_Clickに

を()イベントButton2_clickで

Dim ThreadPleaseWait As New Thread(New ThreadStart(AddressOf YourSubName)) 

    YourThreadName.Start() 

()イベント

YourThreadName.Start() 

このようにすると、いつでもスレッドを中断し、再度初期化します。 YourThreadName.ThreadState.Runningプロパティを使用して、スレッドが実行中であるかどうかを確認することもできます(同じスレッドの複数のインスタンスを避けるため.....)

+5

書式を修正してください。また、編集している間は、それほど好意的なものにしたくないかもしれません。あなたは "no"という言葉が好きではありませんが、中止されたスレッドを再起動することはできません。 OPが求めたものは不可能です。また、Thread.Abort()は有害であるとみなされます。スレッドの実行を制御する方がはるかに優れています。あなたは彼が悪いことを続けさせることによって尋問者に仕えません。同じリスクを冒すことなく、彼の要求を満たす代替案を提供する方が良いでしょう。 – Will

関連する問題