C# - 在需要时从多个运行的计时器中处理一个特定的计时器[关闭]

Posted

技术标签:

【中文标题】C# - 在需要时从多个运行的计时器中处理一个特定的计时器[关闭]【英文标题】:C# - Disposing a specific timer whenever required from multiple running timers [closed] 【发布时间】:2020-07-24 19:02:22 【问题描述】:

我创建了一个代码,该代码在用户输入的时间间隔内调度作业,该时间间隔使用将后台线程作为任务运行的方法,并且调度由 System.Threading.Timer 类负责。用户可以选择根据将发生的特定任务同时安排多个作业,但驱动它们的计时器方法是相同的,基于用户输入的时间间隔。现在如果用户想取消一个特定的工作,我该怎么做?请帮助我是这个领域的新手! 以下是供参考的大纲,因为我无法发布完整的代码:

按钮单击 => 应用程序获取作业名称、作业时间、间隔并调用方法

下面是我的调度程序代码 =>

public void ScheduleTask(int Year, int Month, int Day, int hour, int min, double intervalInHour, Action task)
    
        DateTime now = DateTime.Now;
        DateTime firstRun = new DateTime(Year, Month, Day, hour, min, 0, 0);
        if (now > firstRun)
        
            firstRun = firstRun.AddDays(1);
        
        TimeSpan timeToGo = firstRun - now;
        if (timeToGo <= TimeSpan.Zero)
        
            timeToGo = TimeSpan.Zero;
        
        var timer = new Timer(x =>
        
           task.Invoke();
        , null, timeToGo, TimeSpan.FromHours(intervalInHour));
        timers.Add(timer);
    

用户可以安排多个工作,但如果他想取消一个,我应该如何处理?提前致谢!

【问题讨论】:

所以如果有 20 个作业,您将有 20 个计时器在运行?这不是最有效的方法。 你的问题太宽泛了。目前尚不清楚您使用的是什么Timer 类,但.NET 中的所有实现都提供了一种停止计时器的机制。显然,您需要跟踪您拥有哪些可取消对象以及与之关联的计时器,以某种方式将这些对象呈现给用户,让他们选择一个,然后执行一个允许用户实际取消的命令他们挑选的对象。你有没有尝试过这样做?您具体在哪些方面需要帮助? 我在问题陈述中提到我正在使用 System.Threading.Timers 以及是否有替代方法你能解​​释一下吗?感谢您的帮助! 就像我说的,你使用哪个Timer 实现并不重要(你是对的,你确实把它放在你的开头段落中)。它们都有一些等效的机制。真正的问题在于问题的其余部分,没有minimal reproducible example,没有解释您尝试过的内容,没有提供您需要帮助的特定问题或正在询问。请改进问题。 所以你可以这样想,你在我的应用程序中创建了两个工作。根据提供的调度程序代码,这两个作业被安排在用户提供的某个时间间隔内重复。现在他们都使用相同的方法来安排计时器,但唯一的区别是任务被调用。现在如果用户删除 Job1 如何处理定时器 1 使其不影响定时器 2 的操作? 【参考方案1】:

解决方案可能是创建一个基于 Timer 的自定义类。只需添加您喜欢的任何成员,然后从“Elapsed”事件处理程序的“sender”参数中获取您的自定义 Timer 对象:

也许你可以在ListElapsed 事件中添加每个计时器,在执行你的任务(无论如何)之后,你可以在TagStop 的基础上在List of Timers 中找到那个计时器或者Dispose 那个特定的计时器

 class CustomTimer : System.Timers.Timer
    
        public string Tag;
    

    private void StartTimer()
    
        var timer = new CustomTimer
        
            Interval = 3000,
            Tag= "FirstTimer"
        ;

        timer.Elapsed += timer_Elapsed;
        timer.Start();
    

    void timer_Elapsed(object sender, ElapsedEventArgs e)
    
        string tag = ((CustomTimer)sender).Tag;
        // perform whatever operation
        // here compare this timer in existing timers list 
        // and stop this timer
    

【讨论】:

非常感谢您的帮助!你的方法让我思考,我在 dispose 命令之前实现了一个新的 AutoResetEvent.WaitOne() 然后实现并发出信号,如果我的工作定义文件存在于我存储特定工作的工作定义的目录中,它发出信号它和特定的线程在没有改变第二个计时器的情况下被处理掉了。我从每次调用 timecallback 方法时将执行的操作发出事件信号。感谢大家的宝贵意见。 很高兴听到这个消息 :) 也许你会考虑接受它作为答案或投票感谢

以上是关于C# - 在需要时从多个运行的计时器中处理一个特定的计时器[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

While 循环计时如何在带有多个线程的 C# 中工作?

c# - 如何在运行时从模块代码中获取 PowerShell 模块版本

如何在运行时从 nhibernate 映射文件生成实体类

高速处理列表的多个计时器导致问题

C#反射机制详解

如何停止在 C# 类中运行的计时器