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

时间:2011-09-24 12:20:19

标签: vb.net multithreading notifyicon

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

我已经使用了inizialized线程:

dim th as thread = new thread (addressof elaborate)

在button.click事件中:

th.isbackground= true
th.start()

现在,在表单加载中我已经将我的程序图标化,但是当我开始新线程时,托盘图标会从中复制。 我想解决这个问题,当开始新线程时,它不会显示新的通知图标。

有什么想法吗?

(我在网上找不到任何内容,只有Multiple notification icons appear when using multithreading

1 个答案:

答案 0 :(得分:0)

创建一个名为Elab的类 在那个类里面,放一个叫做work的子 将计时器添加到已禁用的表单

以千分之十表示

在表单类中声明:

Dim El as Elab

在Form_Load()中放置:

El = New Elab()

在你的按钮下,输入:

Dim gThread as new System.Threading.Thread(Address of El.Work)
Timer1.Enabled = True

Inside Elab声明一个名为Result的变量:

Public Result as boolean

当elab完成它正在做的任何事情时,将result设置为true,并将结果存储在稍后可以访问的公共变量中。

计时器内部:

If El.Result = True then
   'Get results, deal with data
end if

这不是特别好写的,并不是一个工作的例子,但是通过给一个线程一个类的一个子地址,然后你可以访问同一个类,通常会指向正确的方向。从其他线程,这意味着您的表单不会冻结,并且您没有创建表单的新实例,您只是访问现有的类子例程;只要确保给自己一个获得结果的方法(在这个例子中,我建议一个计时器,但是一旦线程完成,“获得结果”按钮将完成相同的工作)。

Remeber: 如果您需要Elab在特定部分代码可以继续之前完成(例如,elab可能会添加两个数字,并且您需要继续执行结果),您可以启动该线程并执行此操作:

Do until El.Result = True
    Application.DoEvents()
    System.Threading.Thread.Sleep(1)
Loop

gThread.Join()

希望这有点帮助。

所以问题的答案是:不要将你的sub放在一个表单中,而是将它放在一个可以创建实例的类中。