我有一个包含大量产品的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
时,我有时会获得图像,有时会出现超时异常......
这不是一项艰巨的任务,但是,我怎样才能拥有一个有效的简单代码?
答案 0 :(得分:0)
我担心这里的问题是你正在对UI线程上运行的Load进行跨线程调用。为了避免异常,您需要调用invoke方法,该方法将工作分派给UI线程:
img.Invoke(() => { img.Load(...) });