【发布时间】:2016-12-03 20:59:25
【问题描述】:
我正在尝试将 MVVM 用于通用 Windows 项目,但存储文件的接口对使用异步有很多抱怨。以下代码有时有效:
public object Convert(object value, Type targetType, object parameter, string language)
{
var storageFile = value as StorageFile;
return GetImageAsync(storageFile).Result;
}
private static async Task<ImageSource> GetImageAsync(StorageFile storageFile)
{
var bitmapImage = new BitmapImage();
var stream = await storageFile.OpenAsync(FileAccessMode.Read).AsTask().ConfigureAwait(false);
bitmapImage.SetSource(stream);
return bitmapImage;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
return null;
}
}
在我选择要加载的新图像之前,我收到错误“{”应用程序调用了一个为不同线程编组的接口。 (来自 HRESULT 的异常:0x8001010E (RPC_E_WRONG_THREAD))"}"
所以我尝试将其更改为在另一个线程中使用 CoreDispatcher:
public class FileToImageConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
var storageFile = value as StorageFile;
Task<ImageSource> image = null;
Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
image = GetImageAsync(storageFile);
image.RunSynchronously();
});
return image.Result;
}
private static async Task<ImageSource> GetImageAsync(StorageFile storageFile)
{
var bitmapImage = new BitmapImage();
var stream = await storageFile.OpenAsync(FileAccessMode.Read).AsTask().ConfigureAwait(false);
bitmapImage.SetSource(stream);
return bitmapImage;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
return null;
}
}
位图图像上的 NullReferenceException。当然,这对我来说绝对有意义 - 异步调度程序将控制权交给父进程,尚未分配图像,空引用异常。但是我不知道正确的方法是什么!
【问题讨论】:
-
值转换器根本不应该返回 UIElement。你为什么认为你需要这样的东西?
-
我想获取可能较大的图像文件并将它们显示在应用程序中,提供有关它们的像素/摄影信息,因此我不想冻结 UI 等待文件加载。跨度>
-
不过,转换器应该返回一个 ImageSource(例如 BitmapImage),而不是一个 Image 控件。
-
不确定这种方法是否可行。据我所知,UWP 中的绑定始终是同步的,因此绑定转换器始终被同步调用,即某些异步方法没有等待。但是有内置的异步下载(参见 BitmapImage 类中的 DownloadProgress 和 ImageOpened 事件),但这可能仅限于远程文件(即 http URI)。
-
对于绑定转换器,是的。我正在考虑将 StorageFile 转换为 ImageSource 的 IValueConverter 的外观,但没有成功。 StorageFile 仅提供异步 API,不能在 IValueConverter 中使用。对于表示图像文件的视图模型属性类型,StorageFile 可能不是一个好的选择。
标签: c# async-await uwp win-universal-app storagefile