我可以停止System.Threading.Timer

时间:2011-11-29 19:11:49

标签: c# multithreading timer

我有一个应用程序,它使用计时器偶尔在辅助线程上运行监视任务。其中一些清理任务需要花费大量时间,我希望能够在用户结束程序时中止这些任务(如果可能的话,优雅地)。

有没有办法以编程方式中断线程,因为我可以使用Thread.Abort(),或者我必须在代码中添加一个标志以指示线程已完成并在代码中的恶劣位置检查它这是由计时器启动的?

5 个答案:

答案 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;
}

解释:销毁对象=销毁进程。