2016-02-04 89 views
1

我将定时器的信息传递给另一个函数,但是在传递信息之后,它会一直传递它。我不想关闭定时器。 有没有办法阻止循环?计时器间隔为5秒。定时器连续循环

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 + @"\")) 
     { 
      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()); 
    } 
} 
+1

你要存档什么?我的意思是这段代码的目的是什么?你可能会不必要地使它复杂化。 –

+1

它检查USB并检查它是否已被复制。如果它没有调用函数来复制它@ qqww2 – yhusoonpoint

+0

我不明白你的意思是“它不断传递它”。你的代码要做的是循环一系列驱动器。如果有任何不存在的Directiory并且不在列表中,它将执行一次'process_cop()'方法 – mrsargent

回答

1

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

1

如果(Directory.Exists ......!) {

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

+0

你可以打破从第二个条件循环或者以相同的方式 – Friendassist

+0

它没有工作,它不断循环@Friendassist – yhusoonpoint

1

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

当然诸位需要知道什么时候来设置和重置标志..

Tagobject型的,可以容纳任何东西,包括一个简单的int或一个不错的Enum ..

在你的情况我建议使用至少三种状态值:

  • 没有新文件
  • 个新文件检测过程
  • 复制

而正在进行复制,我会直接从Tick返回;否则请进行检查,并在找到新文件时设置标志。

然后才将其设置和复制方法调用后复位..

但是,你要的是给你什么逻辑代码。

你其实使用2态标志已经;但复制操作可能需要比预期更长的时间,所以首先要尝试的是在process_copy();之前移动newfilesfound = false; ..但有三个状态会更好,无论是将它存储在课程级别还是与定时器一起使用。

+0

我不知道如何使用Timer.Tag,我不明白它是如何工作的。 – yhusoonpoint

+0

它只是一个属性,一个变量,你可以像任何变量一样使用它。它并不“起作用”,它只是一个方便的地方,可以将信息与对象一起放置,如Control或DataRow或此处的定时器:'usbchecker.Tag = 1;'或'if(usbchecker.Tag == 0 )做点什么等等。你的问题不在于计时器,而在于你的控制逻辑,或者是因为code4life注意到你的状态机,这是不完整的imo .. – TaW

+0

它仍然在循环。 – yhusoonpoint

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”。

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