c# 怎么实现快速结束线程(不用abort)

程序员痴汉 2016-09-25 06:52:04
如题,我有个线程,线程里无限循环读取某个插件反馈回来的数据,这个线程是很耗时间的,大概2~4s。(注:此插件不能重复调用。)
============================前为背景========================================
现在我需要在其他地方使用这个插件,那么必须要结束这个线程。虽然Abort可以,但是会有异常“正在终止线程,
catch虽然能够跳过,但是有异常这东东也是不好滴,
我用Application.DoEvents();吧,速度又慢了很多,
用Suspend挂起吧,好像还有会有冲突的异常。
实在无果,问问大神们,
请问有没有其他办法能够速度结束线程?
...全文
11154 28 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
许多 STA 模式跨进程服务都不能胡乱在子线程中调用。例如你通过 COM 访问 Office,那么你应该在 UI 主线程中调用它,不要在子线程中访问。在子线程中访问可能不报错,但是会等待10秒钟都不结束、还容易崩溃,而在 UI 主线程访问则从不出问题、也非常快速(10秒钟变成了100毫秒)。 如果你需要轮询访问它,使用定时器来实现你的逻辑。
tcmakebest 2016-11-27
  • 打赏
  • 举报
回复
这不是线程的问题, 这有点像单例模式问题. 其实不需要让线程停止, 只要让线程的工作结果能够共享就好了.
  • 打赏
  • 举报
回复
引用 8 楼 zx6630542 的回复:
把它设为单线程怎样?我今天把这线程设为单线程sta模式,奇怪的是目前在其他地方使用没有异常,而且速度还行,不知道为什么
sta 本来就是你的插件自身的使用问题。你不应该使用子线程(插件反而有一堆内部错误要处理),你在主线程使用它才能保证顺利。
秋的红果实 2016-11-27
  • 打赏
  • 举报
回复
其实用一个变量,利用while循环是不错的选择,要是考虑效率,试一试win32 API函数,有个TerminateThread,lz试着研究下
  • 打赏
  • 举报
回复
引用 楼主 zx6630542 的回复:
如题,我有个线程,线程里无限循环读取某个插件反馈回来的数据,这个线程是很耗时间的,大概2~4s。(注:此插件不能重复调用。)
既然“死等”返回结果,也就是说你在“死循环+阻塞”着它,那你何必浪费资源去使用子线程?
程序员痴汉 2016-11-26
  • 打赏
  • 举报
回复
引用 20 楼 qq_25095899的回复:
[quote=引用 16 楼 zx6630542 的回复:] [quote=引用 11 楼 qq_25095899的回复:]不用thread ,不用while(true) , 用timer就可以了, 停了timer就是你要的效果。
timer怎么行,里面代码的执行时间都不确定[/quote] timer为什么就不能确定执行时间了呢? System.Timers.Timer t = new System.Timers.Timer(10000); t.Elapsed += new System.Timers.ElapsedEventHandler(theout); ....... public void theout(object source, System.Timers.ElapsedEventArgs e) { t.Enabled = false; 。。。。 你的代码 t.Enabled = true; } 执行前停掉,执行玩继续不就是了 。[/quote] 用timer万一你没设定好时间就会卡,例如本来执行完这写代码要5s,而你设置1s,则会卡ui
程序员痴汉 2016-10-02
  • 打赏
  • 举报
回复
引用 15 楼 小疯纸纸的回复:
线程方法直接return跳出结束,你这个插件是不是需要手动释放?
可以手动释放,但是最好不用,这样耗资源多
程序员痴汉 2016-10-02
  • 打赏
  • 举报
回复
引用 14 楼 angel6709的回复:
[quote=引用 13 楼 stherix 的回复:] 为什么Abort不好? 这是外部干涉一个线程强大的机制 真正做到想停就停,比起在线程体内不停的if (terminated)强到不知道哪去了 catch个ThreadAbortException算什么
如果线程中没有非托管资源,abort 还好(不建议用),有的话,不行。[/quote] 什么叫飞托管资源,托管什么?
大然然 2016-10-01
  • 打赏
  • 举报
回复
引用 16 楼 zx6630542 的回复:
[quote=引用 11 楼 qq_25095899的回复:]不用thread ,不用while(true) , 用timer就可以了, 停了timer就是你要的效果。
timer怎么行,里面代码的执行时间都不确定[/quote] timer为什么就不能确定执行时间了呢? System.Timers.Timer t = new System.Timers.Timer(10000); t.Elapsed += new System.Timers.ElapsedEventHandler(theout); ....... public void theout(object source, System.Timers.ElapsedEventArgs e) { t.Enabled = false; 。。。。 你的代码 t.Enabled = true; } 执行前停掉,执行玩继续不就是了 。
黑娃 2016-09-30
  • 打赏
  • 举报
回复
加变量在while,或者强制终止捕捉异常。这两个方法是结束一个线程的不二选择
stherix 2016-09-29
  • 打赏
  • 举报
回复
为什么Abort不好? 这是外部干涉一个线程强大的机制 真正做到想停就停,比起在线程体内不停的if (terminated)强到不知道哪去了 catch个ThreadAbortException算什么
路人男主 2016-09-29
  • 打赏
  • 举报
回复
开线程池,在线程池中运行,线程结束自动销毁
jmcooler 2016-09-29
  • 打赏
  • 举报
回复
exitFlag ,必须加上 volatile 修饰,否则 C# 编译时,假定只有单线程访问这个变量,而进行优化。优化的结果是,那个子线程可能总是从寄存器读取 exitFlag 的值,结果它读到的永远是 false 值。
jmcooler 2016-09-29
  • 打赏
  • 举报
回复
安全地结束一个线程,需要等待线程结束,但是可能等待你那个 2~4 秒,是必然的。 volatile bool exitFlag = false; 放入你那个线程封装内中。 你那个线程,每个循环,都检查这个变量,是否置了退出标志。 主线程想结束它,可以加下面 2 行代码: exitFlag = true; yourThread.Join(); // 等那个线程退出
程序员痴汉 2016-09-29
  • 打赏
  • 举报
回复
引用 11 楼 qq_25095899的回复:
不用thread ,不用while(true) , 用timer就可以了, 停了timer就是你要的效果。
timer怎么行,里面代码的执行时间都不确定
  • 打赏
  • 举报
回复
线程方法直接return跳出结束,你这个插件是不是需要手动释放?
angel6709 2016-09-29
  • 打赏
  • 举报
回复
引用 13 楼 stherix 的回复:
为什么Abort不好? 这是外部干涉一个线程强大的机制 真正做到想停就停,比起在线程体内不停的if (terminated)强到不知道哪去了 catch个ThreadAbortException算什么
如果线程中没有非托管资源,abort 还好(不建议用),有的话,不行。
大然然 2016-09-28
  • 打赏
  • 举报
回复
不用thread ,不用while(true) , 用timer就可以了, 停了timer就是你要的效果。
程序员痴汉 2016-09-27
  • 打赏
  • 举报
回复
引用 4 楼 Milo米啊米啊米的回复:
你既然是无线循环,那么就增加一个全局变量,比如叫isRead,然后 while(isRead) { ... } 当你想要结束进程的是,就将isRead=false,然后在主线程数据处理的之前还要判断是否isRead==true。
?这全局的试过了,太慢了
程序员痴汉 2016-09-27
  • 打赏
  • 举报
回复
引用 7 楼 sgyiliya的回复:
这个问题我也碰到过,用变量的话,反应比较慢,不用变量的话,就只能接收有异常的现实了,你不要把异常抛出,就把异常用日志记录下来或者不记录都可以的。
把它设为单线程怎样?我今天把这线程设为单线程sta模式,奇怪的是目前在其他地方使用没有异常,而且速度还行,不知道为什么
加载更多回复(8)

111,089

社区成员

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

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

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