我开发了一个应用程序,它在c#.net framework 4中使用ImageList在列表视图中加载了许多图像。图像也被压缩。当许多图像被加载和压缩时,需要很长时间。所以我在backgroundworker中调用这个方法。在后台工作中,我不得不将图像添加到ImageList并将ImageList添加到ListView。所以我使用了safeinvoke()方法listView1.SafeInvoke(d => d.Items.Add(item))。 一切工作正常。图像在列表视图中逐一显示。 但是,应用程序的发布在某些电脑上无法正常工作,并且在某些其他电脑上正常工作。无法正常工作意味着,如果使用OpenFileDialog浏览100个图像加载,然后一些图像被加载并添加到列表视图,然后加载自动停止,而不是将所有图像添加到列表视图,并且没有例外显示。c#应用程序在某些电脑上无法正常工作
我花了很多时间来解决这个问题,但无法弄清楚问题所在。 。哪里有问题?有谁能够帮助我?
private void bgwLoading_DoWork(object sender, DoWorkEventArgs e)
{
ArrayList a = (ArrayList)e.Argument;
string[] fileNames = (string[])a[0];
this.loadMultiImages(fileNames);
}
private void loadMultiImages(string[] fileNames)
{
int i = 1;
int totalFiles = fileNames.Count();
foreach (string flName in fileNames)
{
if (!flName.Contains("Thumbs.db"))
{
Bitmap newBtmap = (Bitmap)Image.FromFile(flName);
FileInfo fi = new FileInfo(flName);
long l = fi.Length;
if (l > compressSize)
{
newBtmap = resizeImage(newBtmap, 1024,768) ;
newBtmap = saveJpeg(IMAGE_PATH + (SCANNING_NUMBER +
) + ".jpg", newBtmap, IMAGE_QUALITY);
}
else
{
File.Copy(flName, TEMP_IMAGE_PATH + (SCANNING_NUMBER + 1) + ".jpg");
}
if (!bgwLoading.CancellationPending)
{
CommonInformation.SCANNING_NUMBER++;
this.SafeInvoke(d => d.addItemToLvImageContainer(newBtmap));
bgwLoading.ReportProgress((int)Math.Round((double)i/(double)
(totalFiles) * 100));
i++;
}
}
}
}
}
public void addItemToLvImageContainer(Bitmap newBtmap)
{
imageList.Images.Add(newBtmap);
ListViewItem item;
item = new ListViewItem();
item.ImageIndex = SCANNING_NUMBER - 1;
item.Text = SCANNING_NUMBER.ToString();
lvImageContainer.Items.Add(item);
lvImageContainer.Items[item.ImageIndex].Focused = true;
}
要找出错误我已经修改了代码如下:
我评论过了两行
//newBtmap = resizeImage(newBtmap, 1024, 768);
// newBtmap = saveJpeg(IMAGE_PATH + scanning_number + ".jpg", newBtmap, Image_Quality);
,并添加的try-catch如下:
try
{
Bitmap newBtmap = (Bitmap)Image.FromFile(flName);
File.Copy(flName, CommonInformation.TEMP_IMAGE_PATH +
(CommonInformation.SCANNING_NUMBER + 1) + ".jpg");
if (!bgwLoading.CancellationPending)
{
this.SafeInvoke(d => d.imageList.Images.Add(newBtmap));
ListViewItem item;
item = new ListViewItem();
CommonInformation.SCANNING_NUMBER++;
item.ImageIndex = CommonInformation.SCANNING_NUMBER - 1;
item.Text = CommonInformation.SCANNING_NUMBER.ToString();
this.SafeInvoke(d => d.lvImageContainer.Items.Add(item));
bgwLoading.ReportProgress((int)Math.Round((double)i/
(double)(totalFiles) * 100));
this.safeInvoke(d=>d.addItemImageContainer(newBtmap))
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
它显示加载一些图像为“OutOfMemoryException”后的错误消息
大多数情况下,下列行会创建异常:
Bitmap newBtmap =(Bitmap)Image.FromFile(flName);
但图像文件没有损坏,其文件扩展名是.JPG。
如何摆脱这个问题?
您可以在代码中添加一些日志记录以指示它是否在特定映像或某个迭代中失败?即它始终是相同的图像,它会失败吗?另外,您是否有任何线索证明失败的PC之间的共同点?我发现在某些场合下,线程在线程中运行而没有异常处理会导致应用程序在不通知的情况下中止。根本不会经常发生,但需要经历几次。我在safeinvoke之前通过在(additemtolv ...)和外部调用中添加异常处理来解决我的问题。 – itayw 2012-02-26 17:32:17
尽量不要多线程,看看问题是否消失。您正在描述线程同步的异味。发布版运行的时间/优化与调试不同,因此您的代码可能运行不一样 – devshorts 2012-02-26 18:54:47
@ mr.kav这不是一样的图片吗?有时我可以加载30个iamges,有时候是20个,这是在发生不确定的时间段之后发生的。 – learner 2012-02-27 18:18:56