我有一个应用程序,它使用计时器偶尔在辅助线程上运行监视任务。其中一些清理任务需要花费大量时间,我希望能够在用户结束程序时中止这些任务(如果可能的话,优雅地)。
有没有办法以编程方式中断线程,因为我可以使用Thread.Abort(),或者我必须在代码中添加一个标志以指示线程已完成并在代码中的恶劣位置检查它这是由计时器启动的?
答案 0 :(得分:5)
您可以在使用.change
执行回调之前停止计时器,但是一旦回调开始执行,您应该使用应用程序级别标志来允许您的代码退出。
作为旁注,你不应该使用thread.abort()
,除非你完全100%确定你知道它将被留下的状态。它会以奇怪的方式严重破坏你的应用程序的稳定性。
答案 1 :(得分:4)
无法知道Thread
回调将提前运行的Threading.Timer
。因此,没有一般的方法可以中止它。可以让回调本身与Thread
实例进行通信,但它会打开几个竞争条件
注意:通常使用Abort
是一种不好的做法。这是一种相当可靠的方法,最终难以检测到死锁和/或资源泄漏。使用像CancellationToken
答案 2 :(得分:3)
使用this.Timer.Change(Timeout.Infinite,Timeout.Infinite); 首先我使用.dispose方法,但它在我的情况下不起作用所以我使用了Timer.change。
这是我找到的最佳解决方案。
答案 3 :(得分:1)
你的意思是这些东西?
using System;
using System.Threading ;
class AppCore : IDisposable
{
Timer TimerInstance ;
string[] Args ;
public AppCore( string[] args )
{
if ( args == null ) throw new ArgumentNullException("args") ;
this.TimerInstance = new Timer( Tick , null , new TimeSpan(0,0,30) , new TimeSpan(0,0,15) ) ;
this.Args = args ;
this.Cancelled = false ;
this.Disposed = false ;
return ;
}
public int Run()
{
// do something useful
return 0 ;
}
private bool Cancelled ;
public void Cancel()
{
lock( TimerInstance )
{
Cancelled = true ;
TimerInstance.Change( System.Threading.Timeout.Infinite , System.Threading.Timeout.Infinite ) ;
}
return ;
}
private void Tick( object state )
{
if ( !Cancelled )
{
// do something on each tick
}
return ;
}
private bool Disposed ;
public void Dispose()
{
lock ( TimerInstance )
{
if ( !Disposed )
{
using ( WaitHandle handle = new EventWaitHandle( false , EventResetMode.ManualReset ) )
{
TimerInstance.Dispose( handle ) ;
handle.WaitOne() ;
}
Disposed = true ;
}
}
return ;
}
}
答案 4 :(得分:0)
public void stopTimer(){
myThreadingTimer = null;
}
解释:销毁对象=销毁进程。