如何在不使用C#中的await的情况下从LocalFolder中读取图像?

时间:2016-03-26 17:16:14

标签: c# asynchronous win-universal-app windows-applications

我正在开发一个Windows应用程序。有一个模型类,其属性CoverSource的类型为ImageSource,属性FileName的类型为string。它们都是对视图的数据出价,因此我无法使其getter或setter异步函数。现在我希望在FileName的setter中调用异步函数,然后通过从CoverSource读取文件来异步设置ApplicationData.Current.LocalFolder。我是C#的新手,得到谷歌的帮助。那么如何编写这样的异步函数并使用回调调用它,就像在Javascript中那样呢?

1 个答案:

答案 0 :(得分:0)

这里有一些相互矛盾的要求。首先,Windows平台(就像任何其他现代移动平台一样)要求您的视图更新是同步的。阻止UI线程不被认为是可接受的;任何更新必须立即。其次,读取文件是基于I / O的操作,因此自然是异步的。因此,这会迫使您采用非阻塞方法。

答案是要意识到这两个要求都是正确的。必须立即更新UI ,并且文件I / O 必须花费任意时间。因此,正确的设计是考虑在I / O正在进行时您的UI是什么样的,然后有目的地为该场景进行设计。

这样的事情应该有效:

public string FileName
{
  get { return fileName; }
  set
  {
    fileName = value;
    LoadFileAsync();
  }
}

private async Task LoadFileAsync()
{
  try
  {
    CoverSource = ...; // "Loading" image or something.
    var image = await ...;
    CoverSource = image;
  }
  catch (Exception ex)
  {
    CoverSource = ...; // "Error" image or something.
  }
}

我有一个更详细的map(),并引入了NotifyTaskCompletion类型,通过这种方法处理了很多样板代码。