我正在为我的程序添加一个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
答案 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