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

How to read image from LocalFolder without using await in C#?

我正在开发 windows 应用程序。有一个模型 class,其中 属性 CoverSource 类型为 ImageSource 和 属性 FileName 类型为 string。它们都是为视图提供的数据,所以我无法创建它们的 getter 或 setters 异步函数。现在我希望在 FileName 的 setter 中调用异步函数,然后通过从 ApplicationData.Current.LocalFolder 读取文件来异步设置 CoverSource。我是 C# 的新手,从 Google 那里得到的帮助很少。那么怎么写这样一个async函数,用callback调用呢,就像Javascript?

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

答案是要意识到这两个要求都是正确的。 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.
  }
}

我有一个 MSDN article on async data binding 更详细,并介绍了一个 NotifyTaskCompletion 类型,它使用这种方法处理大量样板代码。