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

1 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);
}
Run Code Online (Sandbox Code Playgroud)

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

Fal*_*til 6

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

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

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

另一个(我的首选)是在Task中执行copyDirectory方法:

Task.Factory.StartNew(() => copyDirectory(sourceFolderPath, destFolderPath))
Run Code Online (Sandbox Code Playgroud)

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

Invoke(new Action(() => textbox.Text = "Completed!");
Run Code Online (Sandbox Code Playgroud)