用户选择一个图像(使用fileOpenDialog)然后我需要在此图像上顺序运行3个算法(一个算法的输出成为另一个算法的输入)。所以,我正在使用后台工作程序来运行这些算法。
在每个阶段后,我想看到结果图像。为此我创建了一个ImageViewer类,它只是一个包含PictureBox控件的简单表单。这就是
中发生的事情 backgroundworker1_dowork()
{
Image img1 = runAlgo(img); //this statment is executing fine
ImageViewer imgviewer1 = new ImageViewer(img1);
imgviewer1.show();
}
现在imgviewer1正在变得反应迟钝(标题显示不响应)。并且没有图像。
//ImageViewer constructor
ImageViewer(Image img)
{
this.pictureBox1.Image = img;
}
答案 0 :(得分:3)
我建议您为每个算法使用BackgroundWorker,并将以下代码放在BackgroundWorker的RunWorkerComplete事件中:
ImageViewer imgviewer1 = new ImageViewer((Image)e.Result);
imgviewer1.show();
使用e.Result = img;
我不建议从DoWork事件更新UI,因为它在另一个线程上运行,并且您必须实现一些黑客/调用等,以使其工作。使用BackgroundWorker要好得多。即做好工作,然后返回结果。
答案 1 :(得分:1)
后台工作者的dowork将在除UI线程之外的另一个线程上执行。您可以使用Dispatcher.Invoke来确保一些代表UI的代码将在UI线程上运行。
答案 2 :(得分:1)
我建议您使用创建一个ImageViewer实例的策略,编写代码以在此实例中的内部PictureBox中设置Image(方法或属性)。
确保并为每个BackGroundWorker调用处理RunWorkerCompleted事件,并检查错误:请参阅此内容以了解可能出现的并发症的详细注意事项:
在每次连续BackGroundWorker调用完成每次完整返回后,在ImageViewer的单个实例中设置图像,并使用“无效或其他任何内容”强制重新绘制屏幕。最好,
答案 3 :(得分:0)
在赋值之前,是否在ImageViewer构造函数中调用了初始化组件。