System.Timers.Timer Elapsed 事件在调用timer.Stop()后执行

2024-03-11

背景:我有一个计时器,用于跟踪自串行端口数据接收事件被触发以来已经过去了多长时间。我正在为此创建自己的解决方案,而不是使用内置的超时事件,因为我正在获取连续的数据流,而不是发送查询并获取一个响应。

问题:在 DataReceived 处理程序中,我有一条语句来停止计时器,这样计时器就不会过期。问题是很多时候它仍然执行 Elapsed 处理程序后记。

我读过可以使用 SynchronizingObject 来解决这个问题,但我不确定如何实现。

这是我的代码:我试图删掉所有我认为不相关的内容。

    private System.Timers.Timer timeOut;
    private System.Timers.Timer updateTimer;

    public void start()
    {
        thread1 = new Thread(() => record());

        thread1.Start();
    }

    public void requestStop()
    {
        this.stop = true;
        this.WaitEventTest.Set();

    }

    private void record()
    {
        timeOut = new System.Timers.Timer(500); //** .5 Sec
        updateTimer = new System.Timers.Timer(500); //** .5 Sec

        timeOut.Elapsed += TimeOut_Elapsed;
        updateTimer.Elapsed += updateTimer_Elapsed;
        updateTimer.AutoReset = true;


        comport.Open();
        comport.DiscardInBuffer();


        comport.Write(COMMAND_CONTINUOUSMODE + "\r");

        stopwatch.Reset();
        stopwatch.Start();

        recordingStartTrigger(); //** Fire Recording Started Event

        timeOut.Start();
        updateTimer.Start();

        this.waitHandleTest.WaitOne(); //** wait for test to end

        timeOut.Stop();
        updateTimer.Stop();

        comport.Write(COMMAND_COMMANDMODE + Environment.NewLine);
        comport.DiscardInBuffer();
        comport.Close();
        recordingStopTrigger(status); //** Fire Recording Stopped Event

        stopwatch.Stop();
    }


    //***********************************************************************************
    //** Events Handlers


    private void comDataReceived_Handler(object sender, SerialDataReceivedEventArgs e)
    {

        double force = -100000;
        string temp = "-100000";

        //timeOut.SynchronizingObject.Invoke(new Action(()=> {timeOut.Stop();}), new object[] {sender, e});

        timeOut.Stop();

        //** I removed my action code here, keep things simple.


        timeOut.Start();
    }

    private void TimeOut_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        timeOut.Stop();
        updateTimer.Stop();


        //** fire delegate that GUI will be listening to, to update graph.
        if (eventComTimeOut != null && this.stop == false)
        {
            if (eventComTimeOut(this, new eventArgsComTimeOut(comport.PortName, "READ")))
            {
                //retry = true;
                comport.Write(COMMAND_CONTINUOUSMODE + "\r");
                updateTimer.Start();
                timeOut.Start();
            }
            else
            {
                this.stop = true;
                //retry = false;
                this.WaitEventTest.Set();
                status = eventArgsStopped.Status.failed;                     
            }
        }
    }

    void updateTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {

        //** fire delegate that GUI will be listening to, to update graph.
        List<Reading> temp = new List<Reading>(report.Readings_Force);
        eventNewData(this, new eventArgsNewData(temp));

    }

这是众所周知的行为。System.Timers.Timer内部使用ThreadPool以便执行。运行时将排队Timer在线程池中。在你打电话之前它就已经在排队了Stop方法。它将在经过的时间后触发。

为了避免这种情况发生设置Timer.AutoReset如果需要的话,设置为 false 并在已用处理程序中重新启动计时器。环境AutoResetfalse 使计时器仅触发一次,因此为了让计时器按时间间隔触发,请手动再次启动计时器。

yourTimer.AutoReset = false;

private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
     try
     {
         // add your logic here
     }
     finally
     {
         yourTimer.Enabled = true;// or yourTimer.Start();
     }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

System.Timers.Timer Elapsed 事件在调用timer.Stop()后执行 的相关文章

随机推荐

  • 使用阻塞REST请求来实现发布/订阅

    最近 我被要求调查与电话系统供应商集成的可行性 该供应商希望使用 RESTful Web 服务提供电话事件 例如线路振铃 分机应答 呼叫清除 我指出 REST 是一个请求 响应协议 他们正在执行发布 订阅 他们建议的解决方案是发出 HTTP
  • 映射日期时间未转换为正确的格式

    我有这个映射器 在映射逻辑中我将检查属性是否具有属性 CustomDateConverAttribute 如果有 我将调用一个函数将字符串转换为正确的格式 CreateMap
  • 如何取消 HostingEnvironment.QueueBackgroundWorkItem

    有没有办法取消后台任务HostingEnvironment QueueBackgroundWorkItem 有CancellationToken它会通知任务是否被取消 但我该怎么做 参考https msdn microsoft com en
  • Python 无法识别两个相等的字符串

    我在 python 中遇到了一个关于字符串的奇怪问题 我有两个列表 我必须在两个字符串中找到相同的名称 第二个列表是来自之前打开的文件的 readline 这是我的代码 import requests import sys from bs4
  • 将 y 轴网格线添加到 D3 甘特图

    将水平网格线添加到 d3 甘特图的最佳方法是什么这个例子 http bl ocks org baramuyu be8e3005cfcb0aba5f763963c75f3c7e 我最初想制作一个轴并在图表的长度上做刻度线 如这个例子 http
  • 将变量传递给 Mako 模板

    在 Perl 中 通过使用 Template Toolkit 这就是我所做的 Perl my vars name gt Count Edward van Halen tt gt process letters overdrawn vars
  • 通过引用传递参数

    我想问是否可以通过引用将参数传递给脚本函数 即在 C 中执行如下所示的操作 void boo int myint myint 5 int main int t 4 printf d n t t gt 4 boo t printf d n t
  • Angular HttpInterceptor 不更改标头

    我编写了一个 Angular 4 3 6 HttpInterceptor 来添加一些标头字段 但是如果我在调试器中检查它们 标头不会更新 任何想法 import Injectable from angular core import Htt
  • python读取大数据的不同方式

    我正在处理大数据 因此找到一种读取数据的好方法非常重要 我只是对不同的阅读方法有点困惑 1 f gzip open file r for line in f process line how can I process nth line c
  • 更改 Flask/Dash 中的图标

    试图获得favicon加载我遵循了互联网上的建议 server Flask name static folder static app dash Dash external stylesheets external stylesheets
  • Jquery 的选择插件,带有链接插件和选择框

    我是新来的 所以这就是问题 我尝试将所选插件 http harvesthq github com chosen 与链接插件 http www appelsiini net projects chained 一起用于我的选择框 但效果不佳 这
  • 如何配置 virtualenvwrapper 与 pyenv 一起使用

    我正在尝试设置我的 imac mavericks 以便能够轻松切换到不同版本的 python 我使用 rbenv 成功地为 Ruby 项目完成了此操作 并发现 pyenv 正是我在这方面所寻找的 我遇到的问题是使用 pyenv 创建虚拟环境
  • 如何在 git 存储库的特定状态下显示文件的内容?

    我想显示 git 存储库特定状态下的路径给出的文件的内容 我没有成功尝试这个 git show f825334150cd4bc8f46656b2daa8fa1e92f7796d Katana source Git GitLocalBranc
  • 如何使用 IEnumerable<> 类型创建 CodeFunction2?

    我确实需要创建如下所示的内容 我正在构建 2 个类 第一个类是名称为 tableNameAsSingular 即 AddressEntity 的类 在我的第二个工作类中 我需要具有如下所示的内容 public IEnumerable
  • 计时器和 JFrame 错误

    我正在制作一个带有计时器和 JFrame 的游戏 以及许多其他东西 但只有这两个会引起问题 在运行下面的片段后 我收到了一个奇怪的错误 至少对于之前从未使用过这些类的我来说是这样 开始执行这个 private static GameView
  • Java 使用 Math.ceil 向上舍入为 int

    int total int Math ceil 157 32 为什么它仍然返回4 157 32 4 90625 我需要四舍五入 我环顾四周 这似乎是正确的方法 I tried total as double输入 但得到 4 0 我究竟做错了
  • 查找一组字符串中 K 个最长的公共后缀

    我想在一组字符串中找到最长的常见后缀 以检测我的自然语言处理项目中的一些潜在的重要语素 给定频率K gt 2 在字符串列表中找到K个最常见的最长后缀S1 S2 S3 SN 为了简化问题 这里举一些例子 Input1 K 2 S firema
  • 确定按下“Backspace”按钮

    How to determine in GWT that user pressed Backspace button I tried this but it does not work Override public void onKeyP
  • zip mime 类型,何时选择哪一种

    到目前为止 对于 Zip 文件的 Mime 类型 我已经看到 应用程序 八位字节流 多部分 x zip 应用程序 zip 应用程序 zip压缩 应用程序 x zip 压缩 我想我的问题是哪个是 最好的 为什么 为什么有这么多选择 我使用 w
  • System.Timers.Timer Elapsed 事件在调用timer.Stop()后执行

    背景 我有一个计时器 用于跟踪自串行端口数据接收事件被触发以来已经过去了多长时间 我正在为此创建自己的解决方案 而不是使用内置的超时事件 因为我正在获取连续的数据流 而不是发送查询并获取一个响应 问题 在 DataReceived 处理程序