从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);
}
}
您在worker_addmage上缺少RunWorkerAsync()。此外,消息框应该被封送,因为您的进程不在主UI线程中。