多线程多窗口应用程序不工作

本文关键字:工作 应用程序 窗口 多线程 | 更新日期: 2023-09-27 18:04:15

我想创建一个远程安装程序。我希望能够在每次安装开始时有一个窗口启动,并给出一个进度条与工作的大致进度。

如果我在主线程外创建窗口,我可以访问它的所有元素,但由于实际运行安装的任务,它没有响应。如果我在一个新线程中启动窗口,我似乎无法让主线程识别窗口中的任何元素,因此我无法更新进度条。

如何创建一个响应式多线程UI ?

多线程多窗口应用程序不工作

要保持UI响应第二个线程(它正在做这项工作),并能够从第二个线程更新UI,您需要在控件上使用Invoke。这里有很多可用的代码片段。

这里有一个简短的例子:我如何从一个没有创建它的线程更新我的用户界面?

你也可以在SO上找到很多这样的例子——只要搜索一下:)

今天还有一个类似的问题——交叉线程问题——在其中一个答案中有一个代码示例。

有一种简单的方法可以安全地从其他线程访问UI控件-使用Control.BeginInvoke(lambda)方法调用lambda。例如,假设您有一个WinForms应用程序,其中有一个表单和带有按钮的进度条。当按钮被点击-一些想象的工作正在进行在单独的线程和进度条应该更新。最简单的是这样写:

private void button1_Click(object sender, EventArgs e)
{
    ThreadStart s = () =>
    {
        for (int i = 0; i <= 10; i++)
        {
            Action a = () => progressBar1.Value = i * 10;
            BeginInvoke(a);
            Thread.Sleep(300); // imitate some workload
        }
    };
    var t = new Thread(s);
    t.Start();
}

同样的结果可以用BackgroundWorker或其他技术实现,但这对我来说是最简单的。

相关文章: