Итак, у меня есть функция, которая загружает изображение с диска asyn c в другой поток (будут загружены большие изображения, и я не хочу, чтобы поток пользовательского интерфейса был заблокирован во время загрузки).
Загрузка выполняется следующим образом
public override void LoadFile()
{
using (var imageStream = new FileStream(_filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
{
Decoder = new TiffBitmapDecoder(imageStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
InitializeFile();
}
}
Затем я хочу использовать декодер в основном потоке
public List<ThumbnailModel> LoadPages()
{
var result = new List<ThumbnailModel>();
foreach (var frame in Decoder.Frames) <--// this line throws exception
{
result.Add(new ThumbnailModel
{
Name = _metadataLoader.GetPageName((BitmapMetadata)frame.Metadata),
Bitmap = new WriteableBitmap(frame)
});
}
return result;
}
Теперь вот проблема, когда я достигаю Строка, в которой я пытаюсь получить доступ к Decoder.Frames, выдает исключение (вызывающий поток не может получить доступ к этому объекту, потому что он принадлежит другому потоку).
Есть ли способ использовать свой декодер в основном потоке, если нет , единственное возможное решение - загрузить всю информацию об изображении в другой поток?
Полная версия кода: // это задача, которая вызывает метод ImageFactory LoadFile - NewThread
private async Task OpenFileAsync(string strFilePath)
{
var newFile = _imageFileFactory.LoadFile(strFilePath);
if (newFile != null)
{
_imagefile = newFile;
}
}
//image factory load file - NewThread
public IImageFile LoadFile(string filePath)
{
if (string.IsNullOrWhiteSpace(filePath))
{
return null;
}
var fileExtension = Path.GetExtension(filePath); // .tiff or .jpeg
var file = new ImageFileTiff(filePath, _metatadaFactory, _metadataVersioner);
file.LoadFile();
return file;
}
// ImageFileTiff LoadFile will create a decoder - NewThread
public override void LoadFile()
{
using (var imageStream = new FileStream(_filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
{
Decoder = new JpegBitmapDecoder(imageStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
InitializeFile();
}
}
После того, как у нас есть IImageFile, мы вызываем MainThread (UIThread)
var pages = _imagefile.LoadPages();
Где LoadPages - это место, где приложение ломается. также вызывается в UIThread publi c List LoadPages () {var result = new List ();
foreach (var frame in Decoder.Frames)
{
result.Add(new ThumbnailModel
{
Name = _metadataLoader.GetPageName((BitmapMetadata)frame.Metadata),
Bitmap = new WriteableBitmap(frame)
});
}
return result;
}