Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#计时器出现问题_C# - Fatal编程技术网

c#计时器出现问题

c#计时器出现问题,c#,C#,我有一个方法,我想每3秒钟在单独的线程中调用一个方法(将提到myFanc) 下面的代码很容易做到 Timer myTimer = new Timer(); myTimer.Elapsed += new ElapsedEventHandler( myFanc ); myTimer.Interval = 3000; myTimer.Start(); 上述代码可能导致调用myFanc,而对myFanc的另一个调用尚未完成 我的问题是,我还希望在再次调用myFanc之前完成myFanc,所以基

我有一个方法,我想每3秒钟在单独的线程中调用一个方法(将提到myFanc)

下面的代码很容易做到

 Timer myTimer = new Timer();
 myTimer.Elapsed += new ElapsedEventHandler( myFanc );
 myTimer.Interval = 3000;
 myTimer.Start();
上述代码可能导致调用myFanc,而对myFanc的另一个调用尚未完成

我的问题是,我还希望在再次调用myFanc之前完成myFanc,所以基本上我希望在myFanc完成后每隔3秒在单独的线程中调用该方法,我该如何做


我不介意解决方案是否不使用Timer类,我只想让这种行为起作用。

不要使用计时器,在线程中循环调用“myfanc”并使用


插入所需的延迟。

将计时器的
AutoReset
属性设置为false,然后在事件处理程序的末尾(即“myFanc”)再次调用计时器的
Start
方法。

这是我现在无法想象的两种方法

  • 停止并启动myFanc方法内的计时器,这确保每次运行之间间隔3秒
  • 将您的代码用myFanc封装在锁中,如果没有完成,这将跳过一个回合

  • 确保使用正确的计时器。。system.threading.timer是一个单独的线程。windows.forms中的timer类(或类似的东西)不在myFunc的顶部

    myTimer.Enabled = false;
    
    当它结束的时候,把这个

    myTimer.Enabled = true;
    

    这将导致在函数执行时临时禁用计时器

    这是我使用的解决方案-感谢Jim

    using System;
    using System.Timers;
    using System.Threading;
    
    class myApp
    {
        public static void Main()
    {
          System.Timers.Timer myTimer = new System.Timers.Timer();
          myTimer.Elapsed += new ElapsedEventHandler( myFanc );
          myTimer.Interval = 1000;
          myTimer.AutoReset = false;
          myTimer.Start();
    
          while ( Console.Read() != 'q' )
          {
              ;    // do nothing...
          }
        }
    
    public static void myFanc(object source, ElapsedEventArgs e)
    {
        Console.Write("\r{0}", DateTime.Now);
    
        Thread.Sleep(3000); //the sleep here is just to test the method, wait to be finished before another call the myFanc method is being performed
        System.Timers.Timer myTimer = new System.Timers.Timer();
        myTimer.Elapsed += new ElapsedEventHandler(myFanc);
        myTimer.Interval = 1000;
        myTimer.AutoReset = false;
        myTimer.Start();
    
    }
    

    }使用一个线程和一个线程。像这样睡觉(x)


    @Delashmate:如果您确实已经在使用不同的线程,我支持这个建议-休眠第二个线程是处理延迟的首选方式。@Delashmate:基于什么理由?这是线程的适当使用。sleep@Jim线程睡眠消耗cpu吗?如果是这样,那么它就不是优雅的solutionThread。睡眠暂停线程,因此它不会消耗CPU@Delashmate事件与Thread.Sleep无关。您可以通过暂停线程十秒钟(10000)来检查进程的CPU消耗是否为0…为什么?它非常适合按照这里的要求引入滞后
    using System;
    using System.Timers;
    using System.Threading;
    
    class myApp
    {
        public static void Main()
    {
          System.Timers.Timer myTimer = new System.Timers.Timer();
          myTimer.Elapsed += new ElapsedEventHandler( myFanc );
          myTimer.Interval = 1000;
          myTimer.AutoReset = false;
          myTimer.Start();
    
          while ( Console.Read() != 'q' )
          {
              ;    // do nothing...
          }
        }
    
    public static void myFanc(object source, ElapsedEventArgs e)
    {
        Console.Write("\r{0}", DateTime.Now);
    
        Thread.Sleep(3000); //the sleep here is just to test the method, wait to be finished before another call the myFanc method is being performed
        System.Timers.Timer myTimer = new System.Timers.Timer();
        myTimer.Elapsed += new ElapsedEventHandler(myFanc);
        myTimer.Interval = 1000;
        myTimer.AutoReset = false;
        myTimer.Start();
    
    }
    
    Thread thread = new Thread(new ThreadStart(myTimer));
    thread.Start();
    
    
    void myTimer()
    {
        while (!exit)
        {
            myFunc();
            Thread.Sleep(3000);
        }
    }