如何在 C# 中暂停计时器直到过程完成
How to pause timer till procedure within finishes in C#
我正在构建服务。
此服务处理并将文件从一个文件夹移动到另一个文件夹。
这个服务中有一个定时器,每分钟检查一次,看是否有文件要移动并移动它们
发生的事情是当它启动时移动文件,但如果文件数量很大,则需要超过 1 分钟,这会导致再次调用相同的过程并出现错误
我希望计时器暂停,直到内部函数完成,然后再返回
这是我的代码
protected override void OnStart(string[] args)
{
Timer timer = new Timer();
timer.Interval = IntervalLength;
timer.Elapsed += new ElapsedEventHandler(this.OnTimer);
timer.Start();
}
public void OnTimer(object sender, ElapsedEventArgs args)
{
this.Stop();
DO();
this.Start();
}
private void DO()
{
//Process and move files
}
我添加了 Stop 来停止计时器,但是 Start() 给出了这个错误
Severity Code Description Project File Line Suppression State
Error CS1061 'XMI2DBSrv' does not contain a definition for 'Start' and
no accessible extension method 'Start' accepting a first argument of
type 'XMI2DBSrv' could be found (are you missing a using directive or
an assembly reference?) XMI2DB E:\XMI2DBsrv.cs 73 Active
怎么做?
在您的 OnTimer
方法中,您使用的是 this
。但是 this
指的是包含该方法的 class,而不是 Timer 对象。
您需要在 Timer 对象上调用 Start 和 Stop,在本例中为 sender
。
因此,您要找的是((Timer)sender).Start();
。
我正在构建服务。
此服务处理并将文件从一个文件夹移动到另一个文件夹。
这个服务中有一个定时器,每分钟检查一次,看是否有文件要移动并移动它们
发生的事情是当它启动时移动文件,但如果文件数量很大,则需要超过 1 分钟,这会导致再次调用相同的过程并出现错误
我希望计时器暂停,直到内部函数完成,然后再返回
这是我的代码
protected override void OnStart(string[] args)
{
Timer timer = new Timer();
timer.Interval = IntervalLength;
timer.Elapsed += new ElapsedEventHandler(this.OnTimer);
timer.Start();
}
public void OnTimer(object sender, ElapsedEventArgs args)
{
this.Stop();
DO();
this.Start();
}
private void DO()
{
//Process and move files
}
我添加了 Stop 来停止计时器,但是 Start() 给出了这个错误
Severity Code Description Project File Line Suppression State Error CS1061 'XMI2DBSrv' does not contain a definition for 'Start' and no accessible extension method 'Start' accepting a first argument of type 'XMI2DBSrv' could be found (are you missing a using directive or an assembly reference?) XMI2DB E:\XMI2DBsrv.cs 73 Active
怎么做?
在您的 OnTimer
方法中,您使用的是 this
。但是 this
指的是包含该方法的 class,而不是 Timer 对象。
您需要在 Timer 对象上调用 Start 和 Stop,在本例中为 sender
。
因此,您要找的是((Timer)sender).Start();
。