【问题标题】:How to run a function every 10 seconds?如何每 10 秒运行一次函数?
【发布时间】:2015-05-18 09:34:03
【问题描述】:

我知道这个问题已经在 SO 上被问过很多次了,但是没有一个能够解决我的问题。 我想使用线程每 10 秒调用一次函数

我有一个进行帧处理的函数。我希望能够在每 10 秒后抓取一帧,然后对其进行处理。我的研究表明,最好为此目的使用线程,并且由于我需要在特定时间段后执行它,因此我还需要一个计时器控件。

我无法弄清楚如何同时使用线程和计时器。此外,我尝试使用BackgroundWorker 控件,它在处理时严重挂断了我的应用程序。我也尝试过使用计时器控件并尝试每 10 秒调用一次该函数,但在这种情况下,如果进程超过 10 秒可能会导致一些问题。

非常感谢任何可以向我展示如何使用线程每 10 秒调用一次函数的示例或源代码。

【问题讨论】:

  • 如果超过 10 秒,您想要发生什么? “可能会导致一些问题”到底是什么意思?您的调用是否需要在 UI 线程中执行?
  • 我认为您使用的代码对于理解您的问题以及如何解决它非常有帮助
  • @Jon Skeet:好吧,如果需要超过 10 秒,我希望它完成处理,然后移动到下一帧进行处理..问题我的意思是它可以挂起应用程序..是的处理完帧后,我需要对 UI 线程进行更多处理..

标签: c# multithreading


【解决方案1】:

您不一定需要线程。您可以使用等待/异步:

public async Task DoSomethingEveryTenSeconds()
{
   while (true)
   {
      var delayTask = Task.Delay(10000);
      DoSomething();
      await delayTask; // wait until at least 10s elapsed since delayTask created
   }
}

在这个例子中,返回的任务永远不会完成;要解决您需要使用其他条件而不是 true 的问题。

在带有 GUI 的应用程序中,这将通过消息循环在 UI 线程上执行 DoSomething,就像任何其他事件(如按钮单击处理程序)一样。如果没有 GUI,它将在线程池线程上运行。

【讨论】:

  • 这将在“做某事”之间等待 10 秒,而不是“每 10 秒执行一次”。特别是如果 DoSomething 需要几秒钟,这可能不是 OP 想要的。或者这可能已经足够好了,很难说。
  • @HansKesting:好点;我确实假设执行DoSomething 所花费的时间可以忽略不计。
  • 要根据要求完成这项工作,您应该在调用DoSomething之前创建Task.Delay任务,然后再调用await任务。
  • @TheodorZoulias 好主意,已修复
  • 这是从斯蒂芬克利里的另一个问题的答案中偷来的想法。 :-)
【解决方案2】:

使用System.Windows.Forms.Timer

private Timer timer1; 
public void InitTimer()
{
    timer1 = new Timer();
    timer1.Tick += new EventHandler(timer1_Tick);
    timer1.Interval = 10000; // in miliseconds
    timer1.Start();
}

private void timer1_Tick(object sender, EventArgs e)
{
    yourfunctionhere();
}
【解决方案3】:

在 Windows 窗体应用程序中,从 Visual Studio 的工具箱中添加一个计时器,在设计器视图下双击它,然后将您希望每 X 秒执行一次的功能放入出现的函数中。确保在属性视图中启用计时器;在那里你也可以改变你的时间间隔(以毫秒为单位)。

【讨论】:

    【解决方案4】:

    如果您想运行代码 10 秒然后停止,可以使用此代码

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Diagnostics;
    using System.Timers;
    namespace Tdo
    {
        class Program
        {
          public static bool k=true;
            static void Main(string[] args)
            {
                Timer q = new Timer(10000);
                q.Elapsed += Q_Elapsed;
                q.Start();
                while(k)
                {
                    Console.WriteLine(DateTime.Now);
                }
                Console.ReadKey();
            }
    
            private static void Q_Elapsed(object sender, ElapsedEventArgs e)
            {
                StopTheCode(ref k);
            }
    
            public static void StopTheCode(ref  bool flag)
            {
                flag= false;   
            }            
    
        }
    }
    

    这里只是简单地将现在的日期时间写为 10 秒,当计时器经过时,它设置标志 = false 和 while 停止,但请注意,这 10 秒将取决于您的设备 GHz 平均执行次数每秒指令会有所不同

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 2012-01-09
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 2018-11-18
      • 1970-01-01
      • 2012-12-08
      • 2022-01-14
      相关资源
      最近更新 更多