我在VisualStudio2010中用VB.NET编写了一个winforms应用程序
我必须在代码中运行一个线程创建。 在form1中,我有一个按钮,用于运行新的单独线程来详细说明一些数据,因此我需要它来避免冻结表单 我已将线程序列化:我在VisualStudio2010中用VB.NET编写了一个winforms应用程序,vb.net,multithreading,notifyicon,Vb.net,Multithreading,Notifyicon,我必须在代码中运行一个线程创建。 在form1中,我有一个按钮,用于运行新的单独线程来详细说明一些数据,因此我需要它来避免冻结表单 我已将线程序列化: dim th as thread = new thread (addressof elaborate) 并单击按钮。单击事件: th.isbackground= true th.start() 现在,在表单加载时,我已经将我的程序图标化,但是当我启动新线程时,托盘图标会从中复制出来。 我想解决的是,当启动新线程时,它不会显示新的notifyi
dim th as thread = new thread (addressof elaborate)
并单击按钮。单击事件:
th.isbackground= true
th.start()
现在,在表单加载时,我已经将我的程序图标化,但是当我启动新线程时,托盘图标会从中复制出来。
我想解决的是,当启动新线程时,它不会显示新的notifyicon
有什么想法吗
我没有在网上找到任何东西,只是创建了一个名为Elab的类
在该类中,放置一个名为work的子类
向已禁用的窗体添加计时器
用滴答声数到1000
在表单类中声明:
Dim El as Elab
内模荷载:
El = New Elab()
在您的按钮下,放置以下内容:
Dim gThread as new System.Threading.Thread(Address of El.Work)
Timer1.Enabled = True
在Elab中声明一个名为Result的变量:
Public Result as boolean
当elab完成它正在做的任何事情时,将结果设置为true,并将结果存储在您以后可以访问的公共变量中
计时器内部:
If El.Result = True then
'Get results, deal with data
end if
这篇文章写得不是很好,也不是一个有效的例子,但它只是给了你一个正确的方向,通过给一个线程一个类中某个子类的地址,你可以从其他线程访问同一个类,这意味着你的表单不会冻结,你也不会创建表单的新实例,您只是在访问现有的classes子例程;在这个例子中,我建议使用一个计时器,但是一旦线程完成,getresult按钮将完成同样的工作
记住:
例如,如果您需要Elab在代码的特定部分可以继续之前完成,则Elab可能会添加两个数字,并且您需要结果才能继续,您可以启动线程并执行以下操作:
Do until El.Result = True
Application.DoEvents()
System.Threading.Thread.Sleep(1)
Loop
gThread.Join()
希望这有点帮助
所以你的问题的答案是;不要将sub放入表单中,而是将其放入可以创建其实例的类中。可能重复的Do not display forms on worker threads。使用BackgroundWorker执行需要时间并导致UI冻结的代码。@我已经阅读了答案,但我不知道如何解决问题。我已经注意到,如果我删除任何表单调用,问题将得到解决。但在这种情况下,我如何在表单中调用sub?