2012-10-31 44 views
-2

我有一个课程,它创建了一个线程.timer如何在线程延迟之后优先执行方法?

System.Threading.Timer timer; 
    TimerCallback cb = new TimerCallback(ProcessTimerEvent); 
    timer = new Timer(cb, reset, 1000, Convert.ToInt64(this.Interval.TotalSeconds)); 
} 

private void ProcessTimerEvent(object obj) 
{ 
    if (Tick != null) 
     Tick(this, EventArgs.Empty); 
} 

我想处理掉这里面定时器,然后定时器工作。

在我的TickEvent我豁免一种方法,但不要压缩这个。

void MyTimer_Tick(object sender, EventArgs e) 
{ 
if(value) 
    MyFunction(); 
} 

定时器必须停止,直到MyFunction完成。

+2

目前尚不清楚你的意思 - 如果你处理定时器,那当然是行不通的。为什么不执行定时器*在执行后?如果您要编辑以澄清您的问题,这将有所帮助。 (我认识到英语可能不是你的第一语言,但尽量让自己更清楚 - 否则很难帮助你。)你还应该指定你正在使用哪种Timer,以及你使用的是什么类型的应用程序正在写作。 –

+0

@JonSkeet好像他在使用'System.Windows.Forms.Timer',因为只有那个计时器有'Tick'事件..其他仍然不清楚 –

+0

@JonSkeet:我编辑我的问题..我使用Threading。计时器...我使用timer.dispose(),但不为我工作。 –

回答

0

我用这个代码。

TryEnter/Exit。在这种情况下,无需停止/重新启动定时器;重叠呼叫不会获得锁定并立即返回。

object lockObject = new object(); 

private void ProcessTimerEvent(object state) 
{ 
    if (Monitor.TryEnter(lockObject)) 
    { 
    try 
    { 
    // Work here 
    } 
    finally 
    { 
    Monitor.Exit(lockObject); 
    } 
    } 
    } 
0

假设您的计时器持有人类名称为MyTimer。你需要的是定义方法Stop这将处置你的Threading.Timer并关闭事件引发。

public class MyTimer 
{  
    System.Threading.Timer timer; 
    bool enabled; 
    TimeSpan interval; 
    public event EventHandler Tick; 

    public MyTimer(TimeSpan interval) 
    { 
     enabled = true; 
     this.interval = interval; 
     timer = new Timer(TimerCallback, null, 1000, (int)interval.TotalSeconds); 
    } 

    private void TimerCallback(object state) 
    { 
     if (!enabled) 
      return; 

     if (Tick != null) 
      Tick(this, EventArgs.Empty);   
    } 

    public void Stop() 
    { 
     timer.Dispose(); 
     timer = null; 
     enabled = false; 
    } 

    public void Start() 
    { 
     enabled = true; 
     timer = new Timer(TimerCallback, null, 1000, (int)interval.TotalSeconds); 
    } 
} 

然后强制将事件发件人打勾到您的计时器对象,并在处理事件时停止计时器。再次处理启动计时器之后。

void MyTimer_Tick(object sender, EventArgs e) 
{ 
    MyTimer timer = (MyTimer)sender; 
    timer.Stop(); // tick events will not be raised 
    if(value) 
    MyFunction(); 

    timer.Start(); // start timer again 
} 
+0

谢谢,但我使用Threading.Timer。 –

+0

Threading.Timer不包含方法启动和停止 –

+0

@DmitryDovgopoly你是天才,它也没有Tick事件 –

-1

要停止计时,你建议立即进行删除Timer.Change Method

public bool Change(int dueTime, int period) 

duetime参数指定Timeout.Infinite防止计时器重新启动。

period指定Timeout.Infinite禁用定期信号。

void MyTimer_Tick(object sender, EventArgs e) 
{ 
    if(value) 
    { 
     //this stop the timer because dueTime is -1 
     _timer.Change(Timeout.Infinite, Timeout.Infinite); 
     MyFunction(); 
     //this start the timer 
     _timer.Change(Convert.ToInt64(this.Interval.TotalSeconds), Convert.ToInt64(this.Interval.TotalSeconds)); 
    } 
} 

Timeout.Infinite是常数-1

+0

谢谢,但是当我应该使用方法Change()?我想停止MyFunction()的定时器。 –

+0

'_timer.Change(1,超时。无限);'这不会停止定时器 - 它将在一毫秒内再次调用回调。然后计时器将被再次设置为一个更多的调用。等 –

+0

@DmitryDovgopoly它将运行一次,回调将被执行,并且定时器将被改变为运行一次。 –