在我的应用程序中,有时我需要手动调用我的计时器。
我试过以下方法:
int originalInterval = t.Interval;
t.Interval = 0;
t.Interval = originalInterval;
但它并不一致。
我创建了一个新的计时器,继承自 System.Timers.Timer,并公开了一个“Tick”方法 - 但问题是“Elapsed”事件随后同步触发。
当我用新线程实现“Tick”时 - 结果再次不一致。
有没有更好的实现方式?
最佳答案
我曾经有过同样的问题,所以我使用 AutoResetEvent 来知道 Elapsed 是否被成功调用:
/// <summary>
/// Tickable timer, allows you to manually raise a 'Tick' (asynchronously, of course)
/// </summary>
public class TickableTimer : System.Timers.Timer
{
public new event ElapsedEventHandler Elapsed;
private System.Threading.AutoResetEvent m_autoResetEvent = new System.Threading.AutoResetEvent(true);
public TickableTimer()
: this(100)
{
}
public TickableTimer(double interval)
: base(interval)
{
base.Elapsed += new ElapsedEventHandler(TickableTimer_Elapsed);
}
public void Tick()
{
new System.Threading.Thread(delegate(object sender)
{
Dictionary<string, object> args = new Dictionary<string, object>
{
{"signalTime", DateTime.Now},
};
TickableTimer_Elapsed(this, Mock.Create<ElapsedEventArgs>(args));
}).Start();
this.m_autoResetEvent.WaitOne();
}
void TickableTimer_Elapsed(object sender, ElapsedEventArgs e)
{
m_autoResetEvent.Set();
if (this.Elapsed != null)
this.Elapsed(sender, e);
}
}
关于c# - 告诉定时器对象异步调用它的 "Elapsed"事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3598625/