Я пытаюсь загрузить BitmapImage в фоновом потоке, а затем установить источник изображения (WPF) для этого BitmapImage.
В настоящее время я пытаюсь что-то вроде этого:
public void LoadPicture()
{
Uri filePath = new Uri(Directory.GetCurrentDirectory() + "/" + picture.PictureCacheLocation);
if (Visible && !loaded)
{
if (File.Exists(filePath.AbsolutePath) && picture.DownloadComplete)
{
BitmapImage bitmapImage = LoadImage(filePath.AbsolutePath);
image.Dispatcher.Invoke(new Action<BitmapImage>((btm) => image.Source = btm), bitmapImage);
loaded = true;
}
}
}
Но я получаю InvalidOperationException, потому что фоновый поток владеет BitmapImage. Есть ли способ передать право собственности на BitmapImage или копию потока пользовательского интерфейса?
Мне нужно загрузить растровое изображение в фоновом потоке, потому что оно может заблокироваться на долгое время.
async/await
вместо того, чтобы возиться сInvoke
. В этом нет необходимости с 2012 года. Кроме того,bitmapImage
будет принадлежать фоновому потоку, только еслиLoadPicture
будет вызван фоновым потоком илиLoadImage
будет использовать поток. Опубликуйте недостающий код - person Panagiotis Kanavos   schedule 03.06.2021BitmapImage
, который загружает данные из файла напрямую с помощьюvar bitmapImage=new BitmapImage(filePath);
. ИспользуйтеPath.Combine
вместо прямого объединения строк - person Panagiotis Kanavos   schedule 03.06.2021var filePath=new Uri(Path.GetAbsolutePath(picture.PictureCacheLocation));
- person Panagiotis Kanavos   schedule 03.06.2021picture.DownloadComplete
, по-видимому, указывает на то, что вы сначала загружаете изображение, затем записываете его в файл, а затем создаете BitmapImage из этого файла. Имейте в виду, что вы можете создать BitmapImage непосредственно из удаленного URL-адреса. - person Clemens   schedule 03.06.2021