这里有两个方法,都返回一个字符串列表:
private async Task<List<string>> Lista()
{
var _folder = Windows.Storage.ApplicationData.Current.LocalFolder;
var file = await _folder.GetFileAsync("MyList.log");
var read = await Windows.Storage.FileIO.ReadTextAsync(file);
string[] lines = read.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
return lines.ToList();
}
private List<string> GetLog()
{
var list = new List<string>
{
"Test1",
"Test2",
"Test3"
};
return list;
}
我的目标是为我的DataContext分配从方法Lista()返回的列表。 由于某种原因,它不起作用。如果没有工作,我的意思是没有任何东西传递给XAML视图。
当我设置DataContext = GetLog()时,一切正常。但是,当我设置DataContext = Lista()时,它不起作用。
我刚开始使用asyn方法,也许我错过了什么?
但据我所知,两种方法都会返回一个字符串列表,以便它们都能正常工作?
完整代码:
public Loggar()
{
this.DataContext = await Lista();
}
private async Task<List<string>> Lista()
{
var _folder = Windows.Storage.ApplicationData.Current.LocalFolder;
var file = await _folder.GetFileAsync("MyListenerVerbose.log");
var read = await Windows.Storage.FileIO.ReadTextAsync(file);
string[] lines = read.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
return lines.ToList();
}
问题在于:
this.DataContext = await Lista();
await
这个词有一个红线,而智能感知就像我在第一条评论中写的一样,我错过了其他的东西吗?
答案 0 :(得分:3)
Lista
没有返回List<string>
,它会返回Task<List<string>>
。在任务完成之前,您无法获取字符串列表。
您应该await
从Lista
返回任务,这将返回结果List
。
答案 1 :(得分:-1)
您无法编写async
构造函数。
您可以从构造函数中调用非等待异步方法,例如:
public SomePage() { setDataContext(); }
async void setDataContext() { DataContext = await Lista(); }
(async void
表示此方法将在后台运行,但会立即返回给调用者,调用者不需要等待它)
或者您可以调用异步方法同步,但它会阻止您的用户界面!
public SomePage() { DataContext = Lista().Result; }
(使用Task<T>.Result
将等待方法完成,然后返回其结果。)
返回Task<T>
的方法可以使用await
关键字来获取其Result
。如果您将方法标记为async
,编译器将构建一个特殊的帮助器类来获取另一个线程上的每个Result
,因此它不会阻止您的UI。
(所以任何async
方法实际上都是class
,但编译器会完成所有操作,使其看起来像是一种方法。)
但是你不能在构造函数上做,构造函数必须同步返回值(新对象)。
(或者你可以说构造函数必须是方法而不是类。)