我将信息从计时器传递到另一个函数,但在传递信息后,它会不断传递它。我不想关掉定时器。 有没有办法可以阻止循环?定时器间隔为5秒。
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
...
答案 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());
}
}