我基本上想要实现一个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"
那么我有什么想法可以做到这一点?
感谢。
答案 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
来电后立即放置。