Winforms 如何处理c#上的线程被中止消息?

Winforms 如何处理c#上的线程被中止消息?,winforms,c#-4.0,Winforms,C# 4.0,我有一个简单的赢表单,上面有两个按钮,一个按钮用于开始,另一个按钮用于停止我的线程 但是,当我按下停止按钮时,我遇到了这个错误:“线程被中止了。” 我的代码有什么问题 Thread th_ModeSendingWorks; private void buttonStart_Click(object sender, EventArgs e) { th_ModeSendingWorks = new Thread(new ThreadStart(Works));

我有一个简单的赢表单,上面有两个按钮,一个按钮用于开始,另一个按钮用于停止我的线程

但是,当我按下停止按钮时,我遇到了这个错误:“线程被中止了。”

我的代码有什么问题

    Thread th_ModeSendingWorks;
    private void buttonStart_Click(object sender, EventArgs e)
    {
        th_ModeSendingWorks = new Thread(new ThreadStart(Works));
        th_ModeSendingWorks.Start();
    }

    private void buttonStop_Click(object sender, EventArgs e)
    {
        th_ModeSendingWorks.Abort();
        textBox1.AppendText("------------------");
    }

    private void Works()
    {
        try
        {
            while (th_ModeSendingWorks.IsAlive)
            {
                textBox1.BeginInvoke((MethodInvoker)delegate()
                {
                    textBox1.AppendText("xxxxxxxxxxx");
                    textBox1.ScrollToCaret();
                });

                Thread.Sleep(1000);
            }
        }
        catch (Exception err)
        {
            textBox1.BeginInvoke((MethodInvoker)delegate()
            {
                textBox1.AppendText("err:" + err.Message);
                textBox1.ScrollToCaret();
            });

        }
    }
正常吗

是……如user1274820所述,请参阅:

在线程上调用此方法时,系统将抛出 线程中的ThreadAbortException以中止它


不要使用Thread.Abort。此方法保留用于.NET运行时需要强制终止线程以卸载程序时

只有在即将卸载AppDomain并希望首先摆脱其中运行的线程时,才能“安全地”使用此选项


要摆脱线程,请以协作模式编写它。这意味着线程应该定期检查某种标志,如果设置了该标志,则正常退出线程方法。要“杀死”线程,只需设置标志并等待线程退出。

很多人都在谈论中止线程有多糟糕,但获取“线程正在中止”消息没有什么错。只需将必要的代码包装在
try{}catch{}
中,并忽略该错误。你的意思是,这是正常的吗?是的-事实上,没有明确的方法中止线程。这就是为什么取消令牌是未来的选择。替代方法是什么?您可以编写线程来检查类似“取消令牌”的变量,并在出现标志时中止自身。在线程执行任何操作之前,它可以检查布尔值cancel=true或类似的值。如果是这样,它可以返回。然后,您的表单可以将其设置为true或false。