我想在Button Click事件中杀死/销毁我的应用程序中的线程。
private void stop_btn_Click(object sender, EventArgs e)
{
Thread.Sleep();
}
此事件是否会挂断我的申请?
这是从我的线程开始的代码
DataTable myTable = new DataTable();`enter code here`
myTable = msgDataSet.Tables["text"];
DataRow[] myRow;
myRow = myTable.Select();
for (int x = 0; x < myRow.Count(); x++ )
{
SendKeys.SendWait(myRow[x]["msg"].ToString());
SendKeys.SendWait("{Enter}");
int sleep = int.Parse(textBox2.Text);
Thread.Sleep(sleep);
}
Thread Spam1 = new Thread(new ThreadStart(Send1));
Spam1.Start();
答案 0 :(得分:4)
请参阅此文章,了解为什么不应该尝试致电Thread.Abort
:
http://www.interact-sw.co.uk/iangblog/2004/11/12/cancellation
问题是你在该线程中破坏了异常安全性。这是因为Thread.Abort
将在该线程中的某个任意点抛出异常,这可能是在加载资源之后,但是在线程进入try / catch之前,它将支持干净地卸载该资源。
相反,您应该在您在该线程中运行的代码中构建合作取消。然后设置某种“取消请求”状态,让线程自杀。 E.g:
foreach(var value in aBunchOfData)
{
if(isCancelled)
{
break;
}
// Continue processing here...
}
在这种情况下,您会公开isCancelled
,并让您的父线程将其设置为true
。
如果你use a BackgroundWorker
to implement your background thread,这个模式就会清楚。
答案 1 :(得分:0)
您编写的代码会将UI线程置于睡眠状态 - >您的应用程序将挂起。你如何实现线程?如果您使用的是BackgroundWorker,则可以enable thread cancellation,如果您使用的是任务,则可以提供cancel token to it。如果您使用的是线程,则可以选择Abort()方法
PS ..如果你想停止你的申请(主线程) - 你可以:
关闭主窗口||调用应用程序退出||呼叫过程杀死....
答案 2 :(得分:0)
如果你想强制关闭一个线程,你可以调用Abort(),它会在目标线程上引发一个ThreadAbortedException
myThread.Abort()
目标线程有机会捕获它并在需要时清理所有资源(当然,如果它想通过捕获异常并继续前进,它也可以忽略它,但这是IMO不好的做法)