Winforms在单独的线程中执行代码

Sha*_*lan 4 multithreading winforms

一点少年问题......

我意识到在Winforms应用程序中,长时间运行的代码应该在自己的线程中执行.如何实现这一点,例如按钮点击事件?

我想这样做是为了释放UI线程,以便我可以同时使用半透明模式对话框表单覆盖当前表单.我已经创建了模态对话框表单,其中有一个位于中心的整齐加载GIF,它可以完全独立于按钮点击事件.

我选择这种方法的原因是因为(1)我想在执行代码时阻止任何用户与表单的交互,以及(2)向用户提供处理正在进行的指示(我不知道如何判断一段特定的代码执行需要多长时间,因此选择一个不确定的加载指示器gif).

此外,关于在单独的线程中执行代码的主题......这不应该适用于任何代码,还是仅适用于长期运行的代码?

我非常感谢你对此事的任何帮助!谢谢!

Fre*_*örk 9

最简单的方法之一是使用BackgroundWorker组件.将BackgroundWorker添加到表单,为事件添加事件处理程序DoWork,并从那里调用长时间运行的函数.您可以通过调用RunWorkerAsyncBackgroundWorker组件上的方法在按钮单击事件处理程序中启动它.

为了知道操作何时准备就绪,请为RunWorkerCompleted事件设置处理程序.

private void Button_Click(object sender, EventArgs e)
{
    myBackgroundWorker.RunWorkerAsync();
}

private void myBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    // long-running operation here; will execute on separate thread
}

private void myBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    // operation is ready
}
Run Code Online (Sandbox Code Playgroud)