このコードを呼び出すボタンがあります
private void but_Click(object sender, EventArgs e)
{
Thread My_Thread = new Thread(() => Send_File());
My_Thread.IsBackground = true;
My_Thread.Start();
}
殺す方法が欲しい
My_Thread
関数から
ファイルを送信()
それを修正する方法を教えてください??? :(
このコードを呼び出すボタンがあります
private void but_Click(object sender, EventArgs e)
{
Thread My_Thread = new Thread(() => Send_File());
My_Thread.IsBackground = true;
My_Thread.Start();
}
殺す方法が欲しい
My_Thread
関数から
ファイルを送信()
それを修正する方法を教えてください??? :(
さまざまな関数で使用している他の変数(intやstringなど)と同じように、スレッドをグローバルに宣言するだけです。
Thread My_Thread; //goes before your functions/main method
そしてそれを使用します:
private void but_Click(object sender, EventArgs e)
{
My_Thread = new Thread(Send_File);
My_Thread.IsBackground = true;
My_Thread.Start();
}
そしてそれを殺します:
private void Send_File()
{
MyThread.Abort();
}
スレッドで実行されているSend_Fileについて話している場合は、たとえば、を使用して終了しbreak、すべてのループを停止して完了します。
編集:オースティンサロネンが彼のコメントで述べたように、これはスレッド参照を上書きします。私の提案は、スレッドリストを使用することです。
public List<Thread> ThreadList=new List<Thread>(); //goes before your functions/main method (public for use in other classes)
そしてそれを使用します:
private void but_Click(object sender, EventArgs e)
{
Thread My_Thread = new Thread(Send_File);
My_Thread.IsBackground = true;
My_Thread.Start();
int ThreadIndex = ThreadList.Count; //remember index
ThreadList.Add(My_Thread);
}
スレッドへの参照を再度作成するには、リストのインデックスを覚えておく必要があります。
スレッドを中止するには、そのインデックスを使用するだけです。
ThreadList[ThreadIndex].Abort();
ThreadList[ThreadIndex] = null;
または、スレッドを元に戻します。
クラスレベルでスレッドを定義します。
public class Whatever
{
Thread My_Thread;
private void but_Click(object sender, EventArgs e)
{
My_Thread = new Thread(() => Send_File());
//...
}
private void Send_File()
{
My_Thread.Abort() //though I can never ever ever encourage doing this
//...
}
}
または単に戻ります。スレッドの作業メソッドが戻ると、スレッドは強制終了されます。
スレッドの実行を中止する必要がある場合は、スレッドを直接使用しないことを強くお勧めします。タスクとを使用CancellationTokenSourceしてキャンセルリクエストを伝達することをお勧めします。進行状況など、UIと通信する必要がある場合は、をお勧めしBackgroundWorkerます。を使用するThread必要がある場合は、中止するようにユーザーに通知する必要があります。これを行うには、スレッドが定期的にチェックして続行する必要があるかどうかを確認する共有ブール値を使用します。スレッドセーフな方法で値を読み書きする必要があります。多分Interlocked.ExchangeあなたのためにそれをするだろうかThread.VolatileReadそしてThread.VolatileWrite...
Thread.Abortを使用すると、スレッドが。をキャッチしようとしない限り、スレッドを停止するだけですThreadAbortException。通常のロジックフローで例外を使用し始めると、少し不便になります。しかし、それは実行可能です。ブロックThread.Abortのコンテキストでは、デッドロックが発生する可能性があります。try/catch/finally(およびその他の制約された領域)ただし、Thread.Abort推奨されるのはそれだけではありません:http: //haacked.com/archive/2004/11/12/how-to-stop-a-thread.aspx