如何在 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
类型,它使用这种方法处理大量样板代码。
我正在开发 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
类型,它使用这种方法处理大量样板代码。