为什么这个winform变得反应迟钝?

时间:2009-11-17 10:09:22

标签: c# .net winforms

用户选择一个图像(使用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;
}

4 个答案:

答案 0 :(得分:3)

我建议您为每个算法使用BackgroundWorker,并将以下代码放在BackgroundWorker的RunWorkerComplete事件中:

  ImageViewer imgviewer1 = new ImageViewer((Image)e.Result);
  imgviewer1.show();

使用e.Result = img;

将结果传回DoWork事件

我不建议从DoWork事件更新UI,因为它在另一个线程上运行,并且您必须实现一些黑客/调用等,以使其工作。使用BackgroundWorker要好得多。即做好工作,然后返回结果。

答案 1 :(得分:1)

后台工作者的dowork将在除UI线程之外的另一个线程上执行。您可以使用Dispatcher.Invoke来确保一些代表UI的代码将在UI线程上运行。

答案 2 :(得分:1)

我建议您使用创建一个ImageViewer实例的策略,编写代码以在此实例中的内部PictureBox中设置Image(方法或属性)。

确保并为每个BackGroundWorker调用处理RunWorkerCompleted事件,并检查错误:请参阅此内容以了解可能出现的并发症的详细注意事项:

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.runworkercompleted.aspx

在每次连续BackGroundWorker调用完成每次完整返回后,在ImageViewer的单个实例中设置图像,并使用“无效或其他任何内容”强制重新绘制屏幕。最好,

答案 3 :(得分:0)

在赋值之前,是否在ImageViewer构造函数中调用了初始化组件。