c#应用程序在某些电脑上无法正常工作

时间:2012-02-26 17:21:38

标签: c# image listview backgroundworker

我开发了一个应用程序,它使用c#.net框架4中的ImageList在listview中加载了许多图像。图像也被压缩。当许多图像被加载和压缩时,则需要很长时间。所以我在backgroundworker中调用该方法。在后台工作者中,我不得不将图像添加到ImageList并将ImageList添加到ListView。所以我使用了safeinvoke()方法listView1.SafeInvoke(d => d.Items.Add(item))。 一切正常。图像在列表视图中逐个显示。 但是应用程序的发布在某些电脑上无法正常工作,并且可以在其他电脑中正常使用。无法正常工作意味着,如果使用OpenFileDialog浏览100个图像进行加载,则会加载一些图像并将其添加到listview,然后加载会自动停止,而不会将所有图像添加到列表视图中,并且不会显示任何异常。

我花了很多次来解决这个问题,但无法弄清楚问题。 。问题出在哪儿?有人能帮助我吗?

 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”

后显示错误消息

以下行很可能会创建异常:

位图newBtmap =(位图)Image.FromFile(flName);

但图像文件没有损坏,文件扩展名为.JPG。

如何摆脱这个问题?

1 个答案:

答案 0 :(得分:0)

我没有答案,但我有一些建议:

  1. 检查有问题的计算机上的.NET框架版本
  2. 检查,如果您对尝试阅读的文件具有权限
  3. 访问文件时使用“try-catch”
  4. 问题:

    1. 此项目是用旧版本的.NET编写的,是否已迁移/升级到.NET 4.0?
    2. 您是否正在使用任何非内置程序集或外部dll进行图像处理?