如何在“主线程”上获取要执行的事件

时间:2010-05-21 16:53:40

标签: vb.net

我有两个类,一个是frmMain一个windows表单,另一个是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

2 个答案:

答案 0 :(得分:1)

您需要使用Control.Invoke,这不会在UI线程上运行委托(事件),但是当事件触发时,您可以使用Control.Invoke在UI线程上执行一段代码,在您的情况下,此代码将是一个显示工具提示的函数。

答案 1 :(得分:0)

谢谢,我通过在frmMain中执行以下操作并在另一个类中调用frmMain中的一个名为dispalyToolTip的新方法来解决这个问题。

在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