Фоновый рабочий поток генерирует исключение nullreference - PullRequest
0 голосов
/ 01 октября 2009

Я загружаю изображения с помощью BackgroundThread. Я получаю «исключение nullreference unexled by user code» после загрузки всех изображений в ListView В чем может быть проблема? Пожалуйста, дайте мне знать.

   private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        try
        {
            int progress = 0;

            string pname;
            Image myImage;
            max_length = files.Length;
            for (int k = 0; k < files.Length; k++)
            {
                ProgressInfo info = new ProgressInfo();
               pname = System.IO.Path.GetFullPath(files[k]);
                myImage = Image.FromFile(pname);
                info.Image = myImage;
                info.ImageIndex = k;
                backgroundWorker1.ReportProgress(progress, info);
                myImage = null;
            }
        }
        catch (Exception ex)
        {
            throw ex.InnerException;
        }
    }

    private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {

            try
            {

                //Get image.
                ProgressInfo img = e.UserState as ProgressInfo;
                //Set image to ListView here.
                ImgListView.Images.Add(getThumbnaiImage(ImgListView.ImageSize.Width, img.Image));
                fname = System.IO.Path.GetFileName(files[img.ImageIndex]);
                ListViewItem lvwItem = new ListViewItem(fname, img.ImageIndex);
                lvwItem.Tag = files[img.ImageIndex];

                lstThumbNailView.Items.AddRange(new ListViewItem[] { lvwItem });

                percent = (int)((float)100 * (float)i / (float)files.Length);
                this.progressBar1.Value = (int)percent;
                 this.label1.Text = "Loading images...";

            }
            catch (Exception ex)
            {
                throw ex.InnerException;
            }
    }

Ответы [ 2 ]

2 голосов
/ 01 октября 2009

Судя по вашим комментариям, вы видите ошибку, потому что не все исключения имеют InnerException. Если InnerException равно NULL, вы увидите эту проблему.

Здесь есть несколько проблем. Во-первых, вот правильный метод try / catch:

try
{
  // Code here
}
catch (Exception ex)
{
  // Handle your exception
  throw; // Rethrow the same exception, preserving the stack trace (optional)
}

Во-вторых, вы, вероятно, злоупотребляете целью ReportProgress. Вы должны попытаться выполнить всю свою логику в своем backgroundWorker_DoWork и отправить процент (от 0 до 100) в ReportProgress для обновления любых индикаторов выполнения.

Возможно, вы использовали ReportProgress так же, как и для устранения многопоточной проблемы. Чтобы добавить элементы в ListBox между потоками, оберните ваш код анонимным методом, используя функцию BeginInvoke

Пример:

// Note: I haven't error checked this, and this is only a rough idea of what 
// you're trying to do. I'm not even sure of the overall goal here.
this.lstThumbnailView.Invoke((Action)delegate
{
  ListViewItem lvwItem = new ListViewItem(name, img.ImageIndex);
  ivwItem.Tag = files[img.ImageIndex];
  lstThumbNailView.Items.Add(lvwItem);
});
0 голосов
/ 01 октября 2009

Спасибо за быстрый ответ. Вот изменения, которые я сделал. Вроде нормально работает.

   private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {

            try
            {
                ProgressInfo img = e.UserState as ProgressInfo;
                LoadImages(img);
                this.progressBar1.Value = img.Percent;
                this.label1.Text = "Loading images...";

            }
            catch (Exception ex)
            {
               throw ex;
            }
    }

    private void LoadImages(ProgressInfo img)
    {
        ImgListView.Images.Add(getThumbnaiImage(ImgListView.ImageSize.Width, img.Image));
        this.lstThumbNailView.Invoke((Action)delegate
        {
            fname = System.IO.Path.GetFileName(files[img.ImageIndex]);
            ListViewItem lvwItem = new ListViewItem(fname, img.ImageIndex);
            lvwItem.Tag = files[img.ImageIndex]; 
            lstThumbNailView.Items.Add(lvwItem); 
        });
    }
...