使主窗体可见时出现InvalidOperationException

时间:2014-07-05 22:09:42

标签: vb.net invalidoperationexception

我正在为我的程序添加一个sys托盘功能,因为它主要在后台运行。当它到达badFiles32时,它表示"跨线程操作无效:控制' mainForm'从在"上创建的线程以外的线程访问。我不记得过去有这个问题,我知道我已经在sys托盘中运行了其他应用程序。这个应用程序根本不复杂,我没有利用多线程。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Me.WindowState = FormWindowState.Minimized
    Me.Visible = False
End Sub


Sub badFiles32(ByVal sender As Object, ByVal e As System.IO.FileSystemEventArgs) Handles pFiles32.Created
    Me.WindowState = FormWindowState.Normal
    Me.Visible = True

'More code below
End Sub

Private Sub blockBTN_Click(sender As System.Object, e As System.EventArgs) Handles blockBTN.Click
    Me.WindowState = FormWindowState.Minimized
    Me.Visible = False
'More Code Below
End Sub

3 个答案:

答案 0 :(得分:2)

您的FileSystemWatcher拥有SynchronizingObject财产。如果您在代码中创建了FileSystemWatcher,就像您在上一个问题中所做的那样,该属性将为null。您需要在初始化时将其设置为您的表单,它应该工作。

 pFiles32.SynchronizingObject = Me

从上面链接:

  

当SynchronizingObject为null时,将在系统线程池的线程上调用处理Changed,Created,Deleted和Renamed事件的方法。有关系统线程池的更多信息,请参阅ThreadPool。

     

当可视Windows窗体组件(如Button)处理更改,创建,删除和重命名事件时,通过系统线程池访问组件可能不起作用,或者可能导致异常。通过将SynchronizingObject设置为Windows窗体组件来避免这种情况,这会导致处理Changed,Created,Deleted和Renamed事件的方法在创建组件的同一线程上调用。

答案 1 :(得分:1)

尝试使用Me.Hide()和Me.Show()代替。 Me.Hide()将使表单不可见,但仍然可以访问和使用它。

答案 2 :(得分:0)

这会禁用异常

Me.CheckForIllegalCrossThreadCalls = False

但委托是真正的解决方案,就像这样:

thread = New System.Threading.Thread(AddressOf DoStuff)
thread.Start()

-

Private Delegate Sub DoStuffDelegate()
Private Sub DoStuff()
    If Me.InvokeRequired Then
        Me.Invoke(New DoStuffDelegate(AddressOf DoStuff))
    Else
        Me.Text = "Stuff"
    End If
End Sub