多线程多窗口应用程序无法正常工作

时间:2011-07-30 22:10:47

标签: c# winforms multithreading

我想创建一个执行远程安装的程序。我希望能够在每次安装开始时启动一个窗口,并给出一个进度条,其中包含作业的大致进度。

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

如何创建具有响应能力的多线程UI?

2 个答案:

答案 0 :(得分:0)

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

以下是一个简短示例:How can I update my user interface from a thread that did not create it?

你也可以在SO上找到几十个例子 - 只需进行搜索:)

这是今天关于SO的另一个类似问题 - cross threading problem - 其中一个答案中有一个代码示例。

答案 1 :(得分:0)

有一种简单的方法可以安全地从其他线程访问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或其他技术可以获得相同的结果,但对我来说这是最简单的。