0

如何安排事件,例如我需要调用一个方法,该方法应该在给定的每一秒内执行其操作。我正在开发简单的 Windows 窗体应用程序,我尝试使用 like

while(true)
{
 methodToBeScheduled();
 Thread.Sleep(60000);
}

这段特殊的代码使我的应用程序在执行时“无响应”。我希望计时器可以做到这一点或您专家建议的任何其他逻辑,请告诉我。

谢谢!

4

4 回答 4

2

您可以使用WinForms 计时器

Timer _timer;

// In constructor (or anywhere you want to start the timer, e.g. a button event):
_timer = new Timer();
_timer.Interval = 60000;    // milliseconds
_timer.Tick += (sender, e) => methodToBeScheduled();
_timer.Start();

这将导致methodToBeScheduled大约每 60 秒调用一次。它将在主 UI 线程上调用,因此请避免在其中进行任何繁重的处理。

使用这个定时器的好处是它是内置的,不需要线程同步,使用简单。缺点是间隔不准确——实际间隔会根据应用程序中需要处理的其他消息而有所不同,并且还受制于 Windows 系统时钟,仅精确到 10-20ms 或所以。

于 2013-06-02T04:42:51.720 回答
1

您可以使用Timer(System.Threading.Timer)。

using System;
using System.Threading;

Timer _timer = null;


_timer = new Timer(o =>
    {
        methodToBeScheduled();
    });
_timer.Change(TimeSpan.Zero, TimeSpan.FromSeconds(60));
于 2013-06-02T04:45:45.460 回答
1

Var sequence = Observable.interval(1).publish Sequence.subscribe ....

将允许订阅一个每秒触发一次 onnext 的 observable。见反应扩展..

讨厌在 iPad 上打字……

于 2013-06-02T04:48:26.517 回答
0

是的,.net 中有三种不同类型的计时器(所有这些都被命名为 Timer,但行为略有不同)。windows.forms 计时器以一定的速率执行一个函数——它从 UI 线程调用该函数。System.Threading Timer 执行相同的操作,但从另一个线程调用该函数。还有一个计时器,我不记得了。您必须根据自己的情况选择其中之一。

线程计时器是我的最爱。是一个如何使用它的示例。请记住,您所调用的任何内容都不是从 UI 线程完成的。如果这是一个问题,可能想要使用表单计时器或同步事物。

于 2013-06-02T04:45:32.373 回答