如何在我的C#应用​​程序中杀死Thread?

时间:2011-11-04 07:11:28

标签: c# multithreading

我想在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();

3 个答案:

答案 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不好的做法)