我想在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);
}
}
答案 0 :(得分:0)
您在worker_addImage上缺少RunWorkerAsync()。还应该编组消息框,因为您的进程不在主UI线程中。