我在VisualStudio2010中用VB.NET编写了一个winforms应用程序

我在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

我必须在代码中运行一个线程创建。 在form1中,我有一个按钮,用于运行新的单独线程来详细说明一些数据,因此我需要它来避免冻结表单

我已将线程序列化:

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?