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

如何在不使用C#中的wait的情况下从LocalFolder读取图像?,c#,asynchronous,win-universal-app,windows-applications,C#,Asynchronous,Win Universal App,Windows Applications,我正在开发一个windows应用程序。有一个模型类,其属性CoverSource类型为ImageSource,属性FileName类型为string。它们都是视图的数据,所以我不能使它们的getter或setter函数异步。现在我希望在FileName的setter中调用一个异步函数,然后通过从ApplicationData.Current.LocalFolder读取文件来异步设置CoverSource。我是C#的新手,从谷歌那里几乎得不到什么帮助。那么,如何编写这样一个异步函数并用回调函数调用

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

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

答案是认识到这两个要求都是正确的。用户界面必须立即更新,文件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.
  }
}

我有一个更详细的示例,它引入了一个
NotifyTaskCompletion
类型,用这种方法处理了大量样板代码。

为什么必须用getter setter编写它?把它放在别的地方。例如,在OnNavigatedTo或OnLoaded方法中,在另一个方法中加载图片,并在其回调上设置属性并引发它。