繁体   English   中英

如何每 10 秒运行一次函数?

[英]How to run a function every 10 seconds?

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

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

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

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

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

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,它将在线程池线程上运行。

使用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();
}

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

如果您想运行代码 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 平均每秒执行指令的次数会有所不同

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM