2013-02-13 37 views
-2

我最近測試了一些FileSystemWatcher,並想知道.NET中的事件處理是如何工作的。例如,與此代碼在VB.NET:在.NET上使用相同函數處理多個事件

Dim fsw1, fsw2, fsw3 As New FileSystemWatcher() 

Private Sub fsw_Error(sender As Object, e As ErrorEventArgs) _ 
           Handles fsw1.Error, fsw2.Error, fsw3.Error 
    Dim iCont As Integer = 1 
    Dim fsw As FileSystemWatcher = CType(sender, FileSystemWatcher) 

    While Not fsw.EnableRaisingEvents AndAlso iCont < 120 
     iCont += 1 

     Try 
      fsw.EnableRaisingEvents = True 
      txtResultado.Clear() 
     Catch 
      fsw.EnableRaisingEvents = False 
      Threading.Thread.Sleep(30000) 
     End Try 
    End While 
End Sub 

每次上執行任何FileSystemWatcher S上的函數的發生錯誤。爲每個FileSystemWatcher生成一個不同的函數線程?它們可以在同時執行多個進程時互相干擾嗎?

C#和VB.NET在這裏可能有區別嗎?

+1

我沒有在這裏看到任何線程或多個FileSystemWatchers - 所以我不知道你在說什麼... – 2013-02-13 09:05:19

+1

@DanielHilgarth FileSystemWatchers是fsw1,fsw2和fsw3。爲什麼downvotes?這個問題是關於與事件相同功能的多次執行。代碼就是一個例子。 – SysDragon 2013-02-13 09:14:40

+1

'Dim fsw1,fsw2,fsw3由於新的FileSystemWatcher()'是多個FileSystemWatchers,@Daniel Hilgarth;如果我遵循,多個線程將是那些@SysDragon感覺可能與多個FileSystemWatchers引發的事件有關的線程。 – J0e3gan 2013-02-13 09:17:05

回答

1

對於哪個線程調用事件沒有限制;如果你想在另一個線程中調用一個事件,你可以在.NET中自由進行。說實話,我無法想象如果沒有爲觀察者使用單獨的線程或異步IO來實現FileSystemWatcher(如果發現更改,則調用事件),因爲您不希望事件中斷正常的應用程序流。

.NET中的事件使用調用列表,該列表在引發事件時調用。調用一個事件時,調用列表在每個線程中被執行,並調用每個方法。就那麼簡單。

功能是.NET功能,所以同爲C#和VB.Net

1

你有eventhandling的基本missunderstanding。您似乎認爲所有觸發的事件都將發送到相同的功能 - 或者可以對同一功能的實例說。

這是不是這樣的。每次你提出一個事件,函數fsw_error都會被調用。如果已經有10次執行該函數,則無關緊要。所以等待直到另一個事件引發(它看起來像你正在嘗試這樣做)不起作用。但是,您可以將事件處理程序封裝在(實例化)類中,並確保所有引發的事件執行都使用相同範圍的變量。林不知道,如果事件是在不同的線程(不這麼認爲),但如果是這種情況,你需要照顧同步訪問當然。

Private Class MyEventHandlerHolder 
    private iCont as Integer = 0;  

    Private Sub fsw_Error(sender As Object, e As ErrorEventArgs) _ 
          Handles fsw1.Error, fsw2.Error, fsw3.Error 

     iCont += 1 

End Sub 

每次文件系統Watcher激發錯誤事件時,iCont現在都會增加。

fsw = new FileSystemWatcher() 
fsw2 = new FileSystemWatcher() 
fsw.EnableRaisingEvents = true; 
fsw2.EnableRaisingEvents = true; 
myHandler = new MyEventHandlerHolder(); 
AddHandler fsw.Onerror, AdressOf myHandler.fsw_error //not sure about the right Event Name in vb 
AddHandler fsw2.Onerror, AdressOf myHandler.fsw_error 

我的vb很長時間回來了。也許你不能將一個實例的方法作爲處理程序。但需要一個靜態(或單例)Handler類。

1

當FileSystemWatchers引發事件時,應在線程池線程上調用該處理程序。事件可能會相互干擾,因爲對FileSystemWatcher引發的事件的長時間處理可能會延遲處理由FileSystemWatcher之一引發的另一個事件。就此而言,您可以在事件處理程序中使用專用線程來執行冗長的阻塞工作。

VB.NET和C#應該沒有區別。

相關問題