定时器连续循环

时间:2016-02-04 21:14:56

标签: c# timer infinite-loop

我将信息从计时器传递到另一个函数,但在传递信息后,它会不断传递它。我不想关掉定时器。 有没有办法可以阻止循环?定时器间隔为5秒。

<system.webServer>   
  <modules runAllManagedModulesForAllRequests="true">
...

5 个答案:

答案 0 :(得分:1)

if(!Directory.Exists ......) {

} 其他 { 返回; //阻止循环到达其余代码! }

答案 1 :(得分:1)

您可以在Timer.Tag属性中设置一些值,并将其用作标志来控制Tick事件中应发生的事情。

当然需要知道何时设置和重置标志..

Tag属于object类型,可以包含任何内容,包括简单的int或不错的Enum ..

在你的情况下,我建议使用至少三个州值:

  • 没有新文件
  • 检测到新文件
  • 正在复制

我会在复制过程中直接从Tick返回;否则检查并在找到新文件时设置标志。

然后设置它并在复制方法调用后重置它..

但您想要编码的逻辑取决于您。

您实际 已使用 2状态标志;但复制操作可能需要比预期更长的时间,因此首先要考虑的是在newfilesfound = false;之前移动process_copy(); ..但是,无论你是否有三个状态都会更好将它存储在课堂级别或使用计时器。

答案 2 :(得分:1)

我会使用Microsoft的Reactive Extensions(Rx)。它基本上是一种用大量操作员创建事件的替代方法,使生活变得非常容易。

一个运算符Observable.Interval可以有效地设置一个计时器,但不是在常量基础上滴答,它将计算最后一个处理程序代码在下一次启动之前运行的时间间隔。因此,如果您的间隔为2秒,但处理时间为X秒,则启动之间会有X + 2秒的差距,如果这是有道理的。

Observable
    .Interval(TimeSpan.FromSeconds(5.0))
    .Subscribe(_ =>
    {
        foreach (DriveInfo usbname in DriveInfo.GetDrives().Where(usbproperty => usbproperty.DriveType == DriveType.Removable && usbproperty.IsReady))
        {
            if (!Directory.Exists(AppDomain.CurrentDomain.BaseDirectory.ToString() + usbname.VolumeLabel + @"\"))
            {
                usbdirectory = new DirectoryInfo(usbname.Name);
                if (!list_to_copy.Contains(usbdirectory))
                {
                    list_to_copy.Add(usbdirectory);
                    newfilesfound = true;
                }
            }
        }
        if (newfilesfound == true)
        {
            process_copy();
            newfilesfound = false;
        }
    });

Just NuGet“Rx-Main”。

答案 3 :(得分:1)

如果找不到该文件,请创建一个目录。它会阻止它循环。

答案 4 :(得分:1)

它保持循环,因为目录不存在所以,如果找不到目录,我会创建一个新目录。这阻止了它循环。

private static List<DirectoryInfo> list_to_copy = new List<DirectoryInfo>();
DirectoryInfo usbdirectory;
backing_up_interface backing_up_interface;
bool newfilesfound = false;

private void usbchecker_timer_Tick(object sender, EventArgs e)
{ 
    foreach (DriveInfo usbname in DriveInfo.GetDrives().Where(usbproperty => usbproperty.DriveType == DriveType.Removable && usbproperty.IsReady))
    {
        if (!Directory.Exists(AppDomain.CurrentDomain.BaseDirectory.ToString() + usbname.VolumeLabel + @"\"))
        {
            Directory.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory.ToString() + usbname.VolumeLabel + @"\");
            usbdirectory = new DirectoryInfo(usbname.Name);
            if (!list_to_copy.Contains(usbdirectory))
            {
                list_to_copy.Add(usbdirectory);
                newfilesfound = true;
            }
        }
    }
    if (newfilesfound == true)
    {
        process_copy();
        newfilesfound = false;
    }
}

//where information is passed to
private void process_copy()
{
    for (int i = 0; i < list_to_copy.Count; i++)
    {
        backing_up_interface = new backing_up_interface(list_to_copy[i]);
        backing_up_interface.Show(); MessageBox.Show(list_to_copy[i].ToString());
    }
}