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