【问题标题】:How to read image from LocalFolder without using await in C#?如何在不使用 C# 中的等待的情况下从 LocalFolder 读取图像?
【发布时间】:2016-03-26 17:16:14
【问题描述】:

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

【问题讨论】:

  • 为什么一定要在getter setter中写?把它放在别的地方。例如在 OnNavigatedTo 或 OnLoaded 方法中
  • 用另一种方法加载图片,并在其回调中设置您的属性并提升它。

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


【解决方案1】:

您在这里有几个相互矛盾的要求。首先,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.
  }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-29
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多