2010-05-21 31 views
2

我有2類上執行,一個是frmMain一個窗口的形式,另一種是在vb.NET類2003如何獲取事件的「主線」

frmMain包含一個啓動按鈕,執行另一類中的監視器功能。我的問題是,我手動添加事件處理程序 - 執行事件時,我如何讓它們在「主線程」上執行。因爲當工具提示氣球在托盤圖標彈出時,它會顯示另一個托盤圖標,而不是彈出現有托盤圖標。我可以確認這是因爲事件是在新線程上觸發的,因爲如果我嘗試從frmMain顯示氣球工具提示,它將顯示在現有的托盤圖標上。

這裏是第二類的一部分(不是整個事情):

Friend Class monitorFolders 
    Private _watchFolder As System.IO.FileSystemWatcher = New System.IO.FileSystemWatcher 
    Private _eType As evtType 

    Private Enum evtType 
     changed 
     created 
     deleted 
     renamed 
    End Enum 

    Friend Sub monitor(ByVal path As String) 
      _watchFolder.Path = path 

      'Add a list of Filter to specify 
      _watchFolder.NotifyFilter = IO.NotifyFilters.DirectoryName 
      _watchFolder.NotifyFilter = _watchFolder.NotifyFilter Or IO.NotifyFilters.FileName 
      _watchFolder.NotifyFilter = _watchFolder.NotifyFilter Or IO.NotifyFilters.Attributes 

      'Add event handlers for each type of event that can occur 
      AddHandler _watchFolder.Changed, AddressOf change 
      AddHandler _watchFolder.Created, AddressOf change 
      AddHandler _watchFolder.Deleted, AddressOf change 
      AddHandler _watchFolder.Renamed, AddressOf Rename 

      'Start watching for events 
      _watchFolder.EnableRaisingEvents = True 
    End Sub 
    Private Sub change(ByVal source As Object, ByVal e As System.IO.FileSystemEventArgs) 
     If e.ChangeType = IO.WatcherChangeTypes.Changed Then 
     _eType = evtType.changed 
      notification() 
     End If 
     If e.ChangeType = IO.WatcherChangeTypes.Created Then 
     _eType = evtType.created 
      notification() 
     End If 
     If e.ChangeType = IO.WatcherChangeTypes.Deleted Then 
     _eType = evtType.deleted 
      notification() 
     End If 
    End Sub 
    Private Sub notification() 
     _mainForm.NotifyIcon1.ShowBalloonTip(500, "Folder Monitor", "A file has been " + [Enum].GetName(GetType(evtType), _eType), ToolTipIcon.Info) 
    End Sub 
End Class 

回答

1

您需要使用Control.Invoke,這將不會運行在UI線程上的委託(事件),但是當事件火,你可以使用Control.Invoke在UI線程上執行一段代碼,在你的情況下,這段代碼將是一個顯示工具提示的函數。

0

謝謝,我通過在frmMain中執行以下操作並在另一個類中調用了名爲dispalyToolTip的frmMain中的新方法。

在FrmMain這裏是我做過什麼:

  1. 添加一個委託

    Private Delegate Sub displayTooltipDelegate(ByVal tooltipText As String) 
    
  2. 增加了新的方法,這我是從其他類

    Friend Sub displayTooltip(ByVal tooltipText As String) 
        If Me.InvokeRequired Then 
         Dim delegate1 As New displayTooltipDelegate(AddressOf displayTooltip) 
         Me.Invoke(delegate1, tooltipText) 
        Else 
         NotifyIcon1.ShowBalloonTip(500, "Folder Monitor", tooltipText, ToolTipIcon.Info) 
        End If 
    End Sub 
    
調用