GUI不在同一个线程中更新c#winforms

时间:2015-01-21 12:29:02

标签: c# winforms

private void buttonSave_Click(object sender, EventArgs e)
{
    textBox1.Text = "DATA is being copied.";

    //my own function to cpy files, working properly
    copyDirectory(sourceFolderPath, destFolderPath);
}

复制需要3秒钟,但我看不到带有text =“DATA正在被复制的TextBox。在进入copyDirectory函数之前”,它只在完成复制后更新文本框,问题是什么?我没有在复制中使用另一个线程。

1 个答案:

答案 0 :(得分:6)

这是因为Windows Forms处理事件的方式。 Windows窗体同步执行所有事件。这意味着当单击一个按钮时,所有附加事件中的所有代码都会在其他任何事件发生之前执行。

这意味着在复制完成之前(即方法返回),文本框将不会被明显更新。

有几个修复方法。一个解决方法是让按钮单击启动计时器,该计时器在100毫秒后执行。然后当计时器执行时,执行复制。

另一个(我的首选)是在Task:

中执行copyDirectory方法
Task.Factory.StartNew(() => copyDirectory(sourceFolderPath, destFolderPath))

注意:这意味着代码在不同的线程上运行,因此如果您想更新文本框以说“完成!”之类的话。当它完成后,你需要这样做

Invoke(new Action(() => textbox.Text = "Completed!");