线程的结束问题,顶者有分. 我的一些线程需要结束.但是这些线程可能是suspend的.也可能没有start(),这些线程调用Abort结束的时候回出现异常问题我该怎么办??怎么才能安全的结束这类线程?? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 由于 Thread.Abort 不会使线程立即中止,因此如果需要确保线程被停止,则必须调用 Thread.Join 以在该线程上等待。Join 是一个阻塞调用,该调用直到线程实际停止执行后才会返回。一旦线程被中止,它将无法重新启动。您还可以调用 Thread.Join 并传递超时时间段。如果线程在超时结束之前死亡,该调用将返回 true。否则,如果该时间在线程死亡之前过期,则该调用将返回 false。在对 Thread.Join 的调用上等待的线程可以被调用 Thread.Interrupt 的其他线程中断。一般建议使用多线程时要考虑以下准则: 不要使用 Thread.Abort 终止其他线程。对另一个线程调用 Abort 无异于引发此线程的异常,而且将不知道此线程已处理到哪一点。 不要使用 Thread.Suspend 和 Thread.Resume 来同步多个线程的活动。不要使用 Mutex, ManualResetEvent、AutoResetEvent 和 Monitor。 不要从主程序中控制辅助线程的执行(比如使用事件),而应在设计程序时让辅助线程负责等待任务,执行任务,并在完成时通知程序的其他部分。如果辅助线程不阻塞,请考虑使用线程池线程。Monitor.PulseAll 在辅助线程阻塞的情况下会很有用。 一定要确保已进入监视器的线程总离开此监视器,即使当线程在监视器中时发生异常时也是如此。C# 的 lock 语句和 Visual Basic 的 SyncLock 语句可自动提供此行为,它们用一个 finally 块来确保调用 Monitor.Exit。如果无法确保将调用 Exit,请考虑将您的设计更改为使用 Mutex。Mutex 在当前拥有它的线程终止后会自动释放。 一定要针对那些需要不同资源的任务使用多线程,避免向单个资源指定多个线程。例如,任何涉及 I/O 的任务都会从拥有其自己的线程这一点得到好处,因为此线程在 I/O 操作期间将阻塞,从而允许其他线程执行。用户输入是另一种可从专用线程获益的资源。在单处理器计算机上,涉及大量计算的任务可与用户输入和涉及 I/O 的任务并存,但多个计算量大的任务将相互竞争。 线程只要正确执行完过程内的代码正常退出才算安全如果你想控件它们全部正常退出,应该设一下全局变量指示他们退出void ExitAll(){public bool bExitNow = true;thread1.Resume();thread1.Join();//同步等它退出//退出了}thread1 的主过程 void thProc(){ while(...) { if (bExitNow) return; //立马退出 //处理代码 }} 线程只要正确执行完过程内的代码正常退出才算安全如果你想控件它们全部正常退出,应该设一下全局变量指示他们退出public bool bExitNow = true;void ExitAll(){thread1.Resume();thread1.Join();//同步等它退出//退出了}thread1 的主过程 void thProc(){ while(...) { if (bExitNow) return; //立马退出 //处理代码 }} Abor肯定会异常,我是将while的条件设置成false 其实,abort确实会有异常.这个我知道.主要是这样的.我动态生成一堆线程.每个线程通过一个标志为来设定是否运行还是挂气.但是,我的要求是.不管这些线程是运行还是挂气.用户要删除某一个线程.这是挂气的线程就回报错,说该线程挂气.运行的现成可以删除.怎么实现这个动能??不管他是否挂起,直接就删掉某一个线程 要先 Join ,再 Abort。 所有线程用IsBackgroud = true;采用线程池管理,需要的时候再创建什么状态都不理,关闭应用程序时线程也就没了,不行吗? c# 调用c++ dll,参数里面传递嵌套的数组 Replace的使用? 谁能告诉我一个关于连接的问题 ASP.NET.触发事件问题。 gridView 多绑定几次,列栏位会发生变化。我的数据是从一个视图查询的,多绑定几次列栏位会向视图排列的顺序逐渐变化。 DataGrid模板列按钮取值问题 静态方法中,如何得到当前类? .net framework 安装了,csc不能用。怎么回事啊? 这个该写到哪个事件里去? sql语句 请问一个极简单又很急的问题。。。。。。。。。。。。。。。 如果在html中引用后台写的过程函数
使用多线程时要考虑以下准则: 不要使用 Thread.Abort 终止其他线程。对另一个线程调用 Abort 无异于引发此线程的异常,而且将不知道此线程已处理到哪一点。
不要使用 Thread.Suspend 和 Thread.Resume 来同步多个线程的活动。不要使用 Mutex, ManualResetEvent、AutoResetEvent 和 Monitor。
不要从主程序中控制辅助线程的执行(比如使用事件),而应在设计程序时让辅助线程负责等待任务,执行任务,并在完成时通知程序的其他部分。如果辅助线程不阻塞,请考虑使用线程池线程。Monitor.PulseAll 在辅助线程阻塞的情况下会很有用。
一定要确保已进入监视器的线程总离开此监视器,即使当线程在监视器中时发生异常时也是如此。C# 的 lock 语句和 Visual Basic 的 SyncLock 语句可自动提供此行为,它们用一个 finally 块来确保调用 Monitor.Exit。如果无法确保将调用 Exit,请考虑将您的设计更改为使用 Mutex。Mutex 在当前拥有它的线程终止后会自动释放。
一定要针对那些需要不同资源的任务使用多线程,避免向单个资源指定多个线程。例如,任何涉及 I/O 的任务都会从拥有其自己的线程这一点得到好处,因为此线程在 I/O 操作期间将阻塞,从而允许其他线程执行。用户输入是另一种可从专用线程获益的资源。在单处理器计算机上,涉及大量计算的任务可与用户输入和涉及 I/O 的任务并存,但多个计算量大的任务将相互竞争。
如果你想控件它们全部正常退出,应该设一下全局变量指示他们退出void ExitAll()
{
public bool bExitNow = true;
thread1.Resume();
thread1.Join();//同步等它退出//退出了}thread1 的主过程 void thProc()
{
while(...)
{
if (bExitNow) return; //立马退出
//处理代码
}
}
如果你想控件它们全部正常退出,应该设一下全局变量指示他们退出public bool bExitNow = true;void ExitAll()
{
thread1.Resume();
thread1.Join();//同步等它退出//退出了}thread1 的主过程 void thProc()
{
while(...)
{
if (bExitNow) return; //立马退出
//处理代码
}
}
主要是这样的.我动态生成一堆线程.每个线程通过一个标志为来设定是否运行还是挂气.
但是,我的要求是.不管这些线程是运行还是挂气.用户要删除某一个线程.这是挂气的线程就回报错,说该线程挂气.运行的现成可以删除.怎么实现这个动能??不管他是否挂起,直接就删掉某一个线程