VB.net消息被抽到标签

时间:2011-05-09 00:00:10

标签: vb.net messages

我基本上想要实现一个Label并让它不断向用户显示信息。我希望能够做到这样的事情:

someMethod():
    printMessage("Starting program")
    doWork() //possibly does some calls to printMessage()
    printMessage("Finished program")
end

printMessage(string message)
    mylabel.Text += message
end

让Windows窗体上的标签不断显示输出。也就是说,不是用户必须等到someMethod()完成并且所有信息突然转储到标签上,我希望在信息出来时将其打印到标签上。

我尝试使用线程来解决这个问题,并且我使用类似的代码工作:

someMethod():
    Dim t As New Thread(AddressOf printMessage)
    t.Start("Starting program")
    doWork()
    printMessage("Finished program")
end

(并且有一个printMessage的委托,在里面我检查mylabel的InvokedRequired属性)但是有了这个,我不断地将所有信息突然转移到标签上,并且不再保留顺序。我可能得到如下输出:

"some other data from doWork()"
"Finished program"
"Starting program"

那么我有什么想法可以做到这一点?

感谢。

2 个答案:

答案 0 :(得分:3)

您可能需要考虑使用BackgroundWorker。它将使您可以轻松地在单独的线程上完成工作,并仍然将进度报告回UI线程。

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

让应用程序的其余部分保持响应。

BackGroundWorker有一个DoWork事件,您可以在其中放置看起来像(大致)这样的代码:

BGW.ReportProgress(0, "Starting Task1")
DoTask1()
BGW.ReportProgress(0, "Completed Task1")

BGW.ReportProgress(0, "Starting Task2")
DoTask2()
BGW.ReportProgress(0, "Completed Task2")

您还将处理ProgressChanged事件,该事件将触发(在启动工作线程的线程上)更新标签。

答案 1 :(得分:0)

调用Application.DoEvents()可能会有所帮助,因为它会强制更新窗口。

尝试在每次printMessage来电后立即放置。