我想创建一个执行远程安装的程序。我希望能够在每次安装开始时启动一个窗口,并给出一个进度条,其中包含作业的大致进度。
如果我从主线程创建窗口,我可以访问它的所有元素,但由于实际运行安装的任务,它没有响应。如果我在新线程中启动窗口,我似乎无法让主线程识别窗口中的任何元素,因此我无法更新进度条。
如何创建具有响应能力的多线程UI?
答案 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
或其他技术可以获得相同的结果,但对我来说这是最简单的。