通过C#VS2013 WPF中的多线程将图像添加到地图时出错

时间:2015-10-24 22:25:27

标签: c# wpf multithreading visual-studio backgroundworker

我想在C#VS2013 WPF桌面应用程序中基于OpenStreetMap向地图添加图像。

但是,生成图像的时间可能很长,所以我需要使用多线程来完成这项工作。在主线程中,我创建了一个新线程来绘制并将图像添加到WPF桌面应用程序。

在单线程中,它运行良好。但是,在多线程中,没有图像可以添加到地图中。

代码如下:

 using System.ComponentModel;
 private BackgroundWorker worker_addImage;
 public MainWindow()
    {
        InitializeComponent();
        worker_addImage = new BackgroundWorker();
        worker_addImage.DoWork += (s, a) =>
        {
            MessageBox.Show("the worker started \r\n");
            DrawImage();
        };
        _worker_addImage.ProgressChanged += _worker_ProgressChanged;
        _worker_addImage.RunWorkerCompleted += (s, a) =>
        {
            MessageBox.Show("image added \r\n");
            AddImage();
        };
    }

    private void ShowImage_Clicked(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("Show Image \r\n");
        if (worker_addImage.IsBusy == false)
            worker_addImage.RunWorkerAsync();
    }
    // why this progress function is not executed ? 
    private static void _worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        MessageBox.Show(e.ProgressPercentage.ToString());
    }

更新

这是将图像添加到地图的代码。

    private void AddImage()
    {
        Uri uri = new Uri(resultImageString, UriKind.Absolute);
        System.Windows.Media.ImageSource imgSource = new BitmapImage(uri);
        // the image generated by DrawImage() is saved in this URI. I can 
        // open and see it. But, it cannot be added to the map. But, if I
        // used single thread, no problems.
        mapImage.Source = imgSource;  
    }

在DrawImage()中。我将图像保存在本地文件夹中作为png文件。 但是,在AddImage()中,我被告知无法访问png文件,因为另一个线程或进程正在使用它。为什么?

这是因为在UI线程中调用了RunWorkerCompleted处理程序,但是" worker_addImage"正在使用png文件。线程?

      using (MemoryStream memory = new MemoryStream())
      {
               using (FileStream fs = new FileStream(res, FileMode.Create, FileAccess.ReadWrite))
                {
                    myImage.Save(memory, ImageFormat.Png);
                    byte[] bytes = memory.ToArray();
                    fs.Write(bytes, 0, bytes.Length);
                }
      }

1 个答案:

答案 0 :(得分:0)

您在worker_addImage上缺少RunWorkerAsync()。还应该编组消息框,因为您的进程不在主UI线程中。