2012-04-10 47 views
3

我需要一個自定義事件,如果找到/創建了特定目錄中的新/現有文件,應該引發該事件。要檢查是否創建了新的文件,我使用SystemFileWatcher,它工作正常。爲了檢查程序啓動時是否存在某些文件,我寫了一些行並且適用於。如何正確提高自定義事件?

我使用這個類的事件參數:

public class FileDetectEventArgs : EventArgs 
{ 
    public String Source { get; set; } 
    public String Destination { get; set; } 
    public String FullName { get; set; } 

    public FileDetectEventArgs(String source, String destination, String fullName) 
    { 
     this.Source = source; 
     this.Destination = destination; 
     this.FullName = fullName; 
    } 
} 

如果SystemFileWatcher養FileCreated事件我用幾行代碼:

public void onFileCreated(object sender, FileSystemEventArgs e) 
{ 
    // check if file exist 
    if (File.Exists(e.FullPath)) 
    { 
     OnNewFileDetect(new FileDetectEventArgs(source, destination, e.FullPath)); 
    } 
} 

如果文件存在,我儘量擡高事件以這種方式:

public void checkExistingFiles(String source, String filter) 
    { 
     DirectoryInfo di = new DirectoryInfo(source); 
     FileInfo[] fileInfos = di.GetFiles(); 
     String fileFilter = filter.Substring(filter.LastIndexOf('.'));  

     foreach (FileInfo fi in fileInfos) 
     { 
      if (fi.Extension.Equals(fileFilter)) 
      { 
       OnNewFileDetect(new FileDetectEventArgs(source, destination, fi.FullName));     
      } 
     } 
    } 

這裏是OnNewFileDetect-事件:

protected void OnNewFileDetect(FileDetectEventArgs e) 
    { 
     if (OnNewFileDetectEvent != null) 
     { 
      OnNewFileDetectEvent(this, e); 
     } 
    } 

問題是,如果onFileCreated-Event引發我的OnNewFileDetect事件一切正常。但是,如果checkExistingFiles找到了一些現有文件並嘗試引發OnNewFileDetect-Event,則不會發生任何事情。我發現OnNewFileDetectEvent-Object是null,所以什麼都沒有發生。但是,如果onFileCreated-Event被觸發,爲什麼它不是null?

回答

2

But why its not null if the onFileCreated-Event is fired?

此事件將爲空,直到某個訂閱該事件。


在一個側面說明,我會考慮換一個更好的模式來提高的情況下,以及在這裏使用標準的C#/。NET命名。這更像是:

// The event... 
public EventHandler<FileDetectedEventArgs> NewFileDetected; 

// Note the naming 
protected void OnNewFileDetected(FileDetectedEventArgs e) 
{ 
    // Note this pattern for thread safety... 
    EventHandler<FileDetectedEventArgs> handler = this.NewFileDetected; 
    if (handler != null) 
    { 
     handler(this, e); 
    } 
} 
+0

謝謝你的快速回答。 現在我得到的錯誤:委託「FileDetecedEvent」不帶兩個參數 – thomas 2012-04-10 23:57:01

+0

@thomas你的事件是如何聲明的? – 2012-04-11 01:54:08

+0

public delegate void FileDetectEvent(object sender,FileDetectedEventArgs e); @Reed Copsey – thomas 2012-04-11 07:45:07

1

@Reed Copsey回答了這個問題;該事件將是null,直到它有訂戶。

此外,這是一個潛在的競爭條件:

if (OnNewFileDetectEvent != null) 
{ 
    OnNewFileDetectEvent(this, e); 
} 

需要注意的是,在多線程的情況下,如果OnNewFileDetectEventif語句後設置爲null,但在下一行調用之前,你的程序會崩潰。當你的事件對象是不可改變的del永遠不會爲空,如果它不是在if聲明空

var del = OnNewFileDetectEvent; 
if (del != null) 
{ 
    del(this, e); 
} 

:一般來說,你會做到這一點。

另請注意,您的命名是非常規的。事件通常不會以On作爲前綴,調用該事件的方法是。

+0

好的,謝謝你,但爲什麼我現在得到錯誤:委託「FileDetecedEvent」不帶兩個參數 – thomas 2012-04-11 00:05:53

相關問題