c# - 告诉定时器对象异步调用它的 "Elapsed"事件

标签 c# asynchronous timer

在我的应用程序中,有时我需要手动调用我的计时器。

我试过以下方法:

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/

相关文章:

c# - 使用 Linq C# 的联接中的正则表达式?

c# - 澄清 SQL 和 ADO.net 文字参数规范

c# - 异步任务中的异常在 Visual Studio 中被拦截

c# - 如何在 ASP.NET Core 中对 void 方法使用异步/等待?

delphi - 如何获取应用程序的运行时间?

android - 如何在 Android 中启动增量定时器

c# - UWP 枢轴,用于导航到其他页面

C# XNA 4.0 全屏鼠标移入第二个显示器

java - 如何使用 Firebase 处理异步数据库?

timer - stm32如何用定时器使脉冲递增/递减