你需要从一个线程到另一个让您的数据。这可以通过两种方式来完成...
首先,你的“后台”线程可以更新某种“CurrentStatus”字符串变量,它的变化,因为它去一起。然后,您可以在窗体上放置一个计时器,然后获取CurrentStatus变量并用它更新标签。
其次,你可以简单地调用从后台线程运行到UI线程使用标签控件的InvokeRequired属性的委托。因此,例如...
private delegate void UpdateStatusDelegate(string status);
private void UpdateStatus(string status)
{
if (this.label1.InvokeRequired)
{
this.Invoke(new UpdateStatusDelegate(this.UpdateStatus), new object[] { status });
return;
}
this.label1.Text = status;
}
您可以调用UpdateStatus()从任何线程(UI或背景)方法,它会检测是否需要调用主UI线程上的操作(和如果是这样的话)。
实际设置线程,你可以这样做是这样的:
private void StartProcessing()
{
System.Threading.Thread procThread = new System.Threading.Thread(this.Process);
procThread.Start();
}
private void Process() // This is the actual method of the thread
{
foreach (System.IO.FileInfo f in dir.GetFiles("*.txt"))
{
// Do processing
// Show progress bar
// Update Label on Form, "f.Name is done processing, now processing..."
UpdateStatus("Processing " + f.Name + "...");
}
}
然后,当用户点击“GO”按钮,你会简单地调用StartProcessing()。
我同意这一点 - 尤其是对于BackgroundWorker。我经常使用它自己。BackgroundWorkers像这样简单和容易地进行多线程操作! – Keithius 2009-02-21 16:45:27