从c# VS2013 WPF多线程添加图像到映射的错误

本文关键字:映射 错误 图像 添加 VS2013 WPF 多线程 | 更新日期: 2023-09-27 18:19:16

我想在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文件的形式保存在本地文件夹中。但是,在addmage()中,我被告知 png文件不能被访问,因为另一个线程或进程正在使用它。为什么?

是否由于RunWorkerCompleted处理程序在UI线程中调用,但png文件被"worker_addmage"线程使用?

      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);
                }
      }

从c# VS2013 WPF多线程添加图像到映射的错误

您在worker_addmage上缺少RunWorkerAsync()。此外,消息框应该被封送,因为您的进程不在主UI线程中。