C#线程终止的问题

Maxdell 2008-05-27 06:54:25
我有个线程向串口写大量数据,而且将写的数据invoke 到 textbox中, 想创建一个button,可以由用户结束本次线程,怎么实现比较好?
我是这样的
if(thread.isAlive) thread.Abort();

但是会弹出一个对话框 “正在终止线程”,不想弹出任何东西,如何实现?
...全文
7946 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
wforest68 2011-05-23
  • 打赏
  • 举报
回复
最好别用abort来结束线程,这样会造成一个任务在未完成的情况下结束线程的,使用Join()安全解决线程最好
a09 2011-01-06
  • 打赏
  • 举报
回复
学习中
yanchao1988 2010-06-10
  • 打赏
  • 举报
回复
1231
yanhang1589 2010-04-23
  • 打赏
  • 举报
回复
18搂的谢谢拉
我也遇到类似的情况 不过没有弹出对话框
我用thread.Abort ()停止接收数据; 再接收数据重新始化后start(),虽然成功了
但没有你的方法好

你的正解
austo 2009-11-22
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 qqiuzaihui 的回复:]
我也遇到类似的问题:
我用一个线程不断地从串口中抓取数据,并且将抓取到的数据invoke 到 textbox中,退出系统时调用 if(thread.isAlive) thread.Abort(); 也弹出了“正在终止线程” 对话框, 尝试了多次,对线程进行了稍微的改动.采用了下面的办法:
1.定义一个读取标志:
        private bool readCardSign = true;
        public bool ReadCardSign
        {
            get { return readCardSign; }
            set { readCardSign = value; }
        }
2.抓取数据线程:
        private void ReadCardFun()
        {
            while (true)
            {
                if (ReadCardSign)      //获取读取标志
                {
                    //获取串口中的数据
                    //获取成功则将数据 invoke 到 textbox中
                    Thread.Sleep(300);
                }
                else
                {
                    break;            //如果读取标志为 false 则中断线程
                }
            }
        }
3. 退出系统时调用:
                if (tdReadCard.IsAlive)
                {
                    ReadCardSign = false;
                }
                this.Close();
  用以上方法, 我解决了所遇到的这个问题.
  我是初学者, 不知道这么写有什么漏洞, 请大家指教.

[/Quote]

这个方法很好,微软的例子就是用这个思路;
qqiuzaihui 2008-12-23
  • 打赏
  • 举报
回复
我也遇到类似的问题:
我用一个线程不断地从串口中抓取数据,并且将抓取到的数据invoke 到 textbox中,退出系统时调用 if(thread.isAlive) thread.Abort(); 也弹出了“正在终止线程” 对话框, 尝试了多次,对线程进行了稍微的改动.采用了下面的办法:
1.定义一个读取标志:
private bool readCardSign = true;
public bool ReadCardSign
{
get { return readCardSign; }
set { readCardSign = value; }
}
2.抓取数据线程:
private void ReadCardFun()
{
while (true)
{
if (ReadCardSign) //获取读取标志
{
//获取串口中的数据
//获取成功则将数据 invoke 到 textbox中
Thread.Sleep(300);
}
else
{
break; //如果读取标志为 false 则中断线程
}
}
}
3. 退出系统时调用:
if (tdReadCard.IsAlive)
{
ReadCardSign = false;
}
this.Close();
用以上方法, 我解决了所遇到的这个问题.
我是初学者, 不知道这么写有什么漏洞, 请大家指教.
flyjimi 2008-12-23
  • 打赏
  • 举报
回复
while (!canceled )
{
//...dowork
Thread.Sleep(100);
}

private void btnStop_Click(object sender, EventArgs e)
{
canceled = true;
}
cerasumat 2008-09-15
  • 打赏
  • 举报
回复
我也是用的3楼的方法,abort()后跟join(),但是一样抛出异常...
LQknife 2008-09-15
  • 打赏
  • 举报
回复
用backgroundwork组件 它自带属性来阻止线程继续
jinjazz 2008-05-28
  • 打赏
  • 举报
回复
>>好的方式结束线程?

应该用信号量
guilin_gavin 2008-05-28
  • 打赏
  • 举报
回复
关注中~
Maxdell 2008-05-28
  • 打赏
  • 举报
回复
是这个错误 ThreadAbortException
数据量蛮大,有没有好的方式结束线程? 因为需要重新开始啊。
dreamsnake 2008-05-28
  • 打赏
  • 举报
回复
个人以为,三楼是正解吧.

不过,我记得线程中止始终会出现 ThreadAbortException 错误的.
baihe_591 2008-05-28
  • 打赏
  • 举报
回复
楼主加一句试试.
if(thread.isAlive)
{
thread.Abort();
thread=null
}
yagebu1983 2008-05-28
  • 打赏
  • 举报
回复
关注+学习!!
我也想知道答案!!
帮你顶!!
gomoku 2008-05-28
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 jinjazz 的回复:]
>>好的方式结束线程?
应该用信号量
[/Quote]

不应该用Abort()。
家鸣 2008-05-27
  • 打赏
  • 举报
回复
设置串口的超时时间,

_serialPort.WriteTimeout = 1000;
Thread writeThread = new Thread(Write);
_continue = true;
writeThread.Start();
//写数据
void Write()
{
while (_continue)
{
_serialPort.WriteLine(...);
}
}
//退出线程
public void CloseSerial()
{
_continue=false;
writeThread.Join();
_serialPort.Close();

}
Maxdell 2008-05-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 edyang 的回复:]
我估计楼主还需要2到3年时间来把这个问题弄明白。。。问问你公司的其他高手吧。运气好了可以一年内弄明白。
[/Quote]

dotNET 做项目此为第一次,发现PC端对于多任务的操作还没有UCOS下面来得轻松。2,3个月不出网管都下岗了,运气好一年?哥们儿走好哦:)
Tll_W 2008-05-27
  • 打赏
  • 举报
回复
按理说线程处理的数据量比较小的话结束时没有这个过程的,你的这个数据量有点大,所以终止不会迅速结束的,本人对线程也是了解点皮毛,等待高手出现。。。
Edward 2008-05-27
  • 打赏
  • 举报
回复
我估计楼主还需要2到3年时间来把这个问题弄明白。。。问问你公司的其他高手吧。运气好了可以一年内弄明白。
加载更多回复(3)

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧