这里有两种不同的方法,我将发布两个选项以帮助指引您正确的方向
您应该在另一个线程上执行此操作,然后从该线程更新您的UI线程。在UI线程上执行此工作会阻止进一步处理。
如果您无法将此代码移动到UI线程,则始终可以调用Application.DoEvents
,但我强烈建议您首先探索这些选项:
第二种选择是这样的:
您需要将数据从一个线程传递到另一个线程。有几种方法可以实现...
首先,您的“后台”线程可以更新某种“CurrentStatus”字符串变量,随着它的进行而更改。然后,您可以在窗体上放置一个计时器,该计时器将获取CurrentStatus变量并使用它来更新标签。
其次,您可以使用标签控件的InvokeRequired属性通过委托从后台线程调用操作到UI线程。例如...
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;
}
您可以从任何线程(UI 或后台)调用 UpdateStatus() 方法,它会检测是否需要在主 UI 线程上调用操作(如果需要,则执行)。
编辑:要实际设置线程,您可以像这样进行:
private void StartProcessing()
{
System.Threading.Thread procThread = new System.Threading.Thread(this.Process);
procThread.Start();
}
private void Process()
{
foreach (System.IO.FileInfo f in dir.GetFiles("*.txt"))
{
UpdateStatus("Processing " + f.Name + "...");
}
}
然后当用户点击“GO”按钮时,您只需调用StartProcessing()函数即可。