Я написал код для сохранения изображения, сгенерированного приложением. Размер изображения составляет около 32-35 МБ. Сохранение изображения в файл BMB занимает много времени, около 3-5 секунд. Для этой цели я использовал фонового работника, но при запуске фонового работника выдается сообщение об ошибке типа «не удается получить доступ к объекту, так как он создан в другом потоке».
Следующий код:
private void btnSaveDesign_Click(object sender, RoutedEventArgs e)
{
Microsoft.Win32.SaveFileDialog sfd = new Microsoft.Win32.SaveFileDialog();
sfd.Title = "Save design as...";
sfd.Filter = "BMP|*.bmp";
if (sfd.ShowDialog() == true)
{
ww = new winWait();
ww.Show();
System.ComponentModel.BackgroundWorker bw = new System.ComponentModel.BackgroundWorker();
bw.DoWork += new System.ComponentModel.DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
fName = sfd.FileName;
cache = new CachedBitmap((BitmapSource)imgOut.Source, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
bw.RunWorkerAsync();
}
}
void bw_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
ww.Close();
}
void bw_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
BmpBitmapEncoder encoder = new BmpBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(cache)); //here... it says cant access...
using (FileStream file = File.OpenWrite(fName))
{
encoder.Save(file);
}
}
Я объявил «кеш» глобальным объектом. (Подобный прием работал, когда я программировал в Windows Forms с VB.NET.)
ww
- это окно ожидания, которое я хочу отобразить во время выполнения прецессии.
Как это сделать? Есть ли другой простой способ многопоточности в WPF?