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。