2016-02-04 104 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()); 
    } 
}