Winforms PictureBox.Load / LoadAsync不起作用

时间:2015-02-28 20:10:38

标签: c# winforms picturebox

我有一个包含大量产品的xml文件(10,000个产品,最多200,000个产品甚至更多),我正在尝试编写一个简单的winform来获取此xml文件并显示产品图像和数据: 这是和xml示例:

<catalog>
     <product>
          <name>...</name>
          <price>...</price>
          <description>...</description>
         <imageurl>http://www.boscovs.com/wcsstore/boscovs/images/store/product/thumbnails/60314665830t.jpg</imageurl>
     <product>
     <product>
      ...
     <product>
</catalog>

我正在使用背景资料工作人员执行此任务,因此我的代码如下所示:

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
     XmlNodeList xnList = doc.SelectNodes(...);
     foreach (XmlNode product in xnList)
     {
          PictureBox img = new PictureBox();
          img.Dock = System.Windows.Forms.DockStyle.Fill;
          img.Location = new System.Drawing.Point(3, 28);
          img.Size = new System.Drawing.Size(194, 94);
          img.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;

          //img.LoadAsync(product[...].InnerText);

          img.Load(product[...].InnerText);

          this.Invoke(new MethodInvoker(delegate
          {
              // Execute the following code on the GUI thread.
              this.Controls.Add(img);
          }));
     }
 }

当我使用img.LoadAsync时,我看不到任何图像,当我在8700中找到图像编号1990时,我得到了这个例外:

An exception of type 'System.ComponentModel.Win32Exception' occurred in 
System.Windows.Forms.dll but was not handled in user code

Additional information: Error creating window handle.

当我使用img.Load时,我有时会获得图像,有时会出现超时异常......

这不是一项艰巨的任务,但是,我怎样才能拥有一个有效的简单代码?

1 个答案:

答案 0 :(得分:0)

我担心这里的问题是你正在对UI线程上运行的Load进行跨线程调用。为了避免异常,您需要调用invoke方法,该方法将工作分派给UI线程:

img.Invoke(() => { img.Load(...) });