跪求 安全线程终止方法 苦战2天无果~~~~~

清风道禅 2013-12-04 09:37:12
我的程序里有三个线程 不算主程序的 大体情况如下 因公司不能上网所以没有详细的代码 :
1.三个线程
1)一个定时器线程 相当于Timer 用来加快或者降低时间频率。
2)一个线程负责数据模拟。
3)一个负责文件下载和文件发送。
因为第一 第二个线程都是内存数据终止并没有什么异常。
但是第三个线程的终止就出现了问题 因为需要在FTP上面和数据库区查询数据
当我结束线程时会报错 连接数据库失败。
目前三个线程都是由一个变量:
IsRun 来控制跳出循环。
为了保证都跳出循环我在While 循环体外通过调用事件来结束的线程。
并且创建三个变量来分别标识线程已经触发了线程结束方法。
但是还是会出现线程无法终止或者无法连接数据库的错误。或者终止了有一个方法触发了两次 System.Threading.ThreadAbortException 异常。 求解决方案 谢谢
三个线程的循环体都是如下代码形式:

try
{
while (IsRun)
{
//执行的代码块
}
//调用事件来执行结束线程

}
catch (System.Threading.ThreadAbortException exc)
{
//如果收到异常 标识线程已经触发了终止线程的方法

}
...全文
202 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
清风道禅 2013-12-07
  • 打赏
  • 举报
回复
引用 6 楼 sp1234 的回复:
这种慌不择路的所谓“终止线程的方法”,不但会让系统连接数据库之类的状态出错,而且会损坏数据文件,损坏硬件,甚至比如说你的线程正在控制给一个病人输液时可能会不管不顾地无限加大剂量,等等,因为你根本不知道从哪一行跳出来的。系统每一次执行都可能带着不一样的“病症”继续在你try...catch这种自欺欺人的“容错”之下而继续运行。 真正能够让你第三个线程自主地跳出线程,得像你前两个线程的跳出一样才行!
谢谢大哥提醒 我会改进的谢谢
清风道禅 2013-12-07
  • 打赏
  • 举报
回复
引用 7 楼 caozhy 的回复:
不要使用Thread.Abort Resume Supend之类的调用,它们本身就是不安全的。应该让线程自身有序地退出。 http://www.cnblogs.com/bloodish/archive/2011/03/21/1990025.html
谢谢版主 我这几天都在改善这个问题
threenewbee 2013-12-05
  • 打赏
  • 举报
回复
不要使用Thread.Abort Resume Supend之类的调用,它们本身就是不安全的。应该让线程自身有序地退出。 http://www.cnblogs.com/bloodish/archive/2011/03/21/1990025.html
  • 打赏
  • 举报
回复
这种慌不择路的所谓“终止线程的方法”,不但会让系统连接数据库之类的状态出错,而且会损坏数据文件,损坏硬件,甚至比如说你的线程正在控制给一个病人输液时可能会不管不顾地无限加大剂量,等等,因为你根本不知道从哪一行跳出来的。系统每一次执行都可能带着不一样的“病症”继续在你try...catch这种自欺欺人的“容错”之下而继续运行。 真正能够让你第三个线程自主地跳出线程,得像你前两个线程的跳出一样才行!
  • 打赏
  • 举报
回复
挂念 --> 观念 你的所谓“线程已经触发了终止线程的方法”的观念,就好像是在大街上逛街的人忽然因为尿急而慌不择路地当街选择了山里人的那种解决方式,这个观念首先应该改变。
  • 打赏
  • 举报
回复
根本不写这种“异常”程序! 如果你正常地用一个变量(标志)来控制,那么就无需写什么try....catch,而且线程退出是“主动的”根本不会抛出什么异常。 try....catch就是悲催的,你连调试能力都丧失了(你根本不知道是从哪一行代码跳出的),如何调试和改进程序?改变挂念,重新考虑程序设计原则,才好清晰地解决各种开发问题。
清风道禅 2013-12-04
  • 打赏
  • 举报
回复
我这三个线程只和定时器的时间有关系 其他第2个第三线程是相对独立的 但是结束的时候需要三个线程都干掉`
清风道禅 2013-12-04
  • 打赏
  • 举报
回复
引用 1 楼 bdmh 的回复:
因为没有具体代码,所以还是觉得你第三个线程中可能控制的不好,可能导致连接已经断开,在某个地方还在访问数据库,可能三个线程的同步做的不是很好
问题就是你所提到的 正在访问数据库的线程 会出现问题 弄了很久啊 能给点意见吗?
bdmh 2013-12-04
  • 打赏
  • 举报
回复
因为没有具体代码,所以还是觉得你第三个线程中可能控制的不好,可能导致连接已经断开,在某个地方还在访问数据库,可能三个线程的同步做的不是很好

110,539

社区成员

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

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

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