使用异步方法返回列表

时间:2014-11-20 18:44:18

标签: c# asynchronous

这里有两个方法,都返回一个字符串列表:

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这个词有一个红线,而智能感知就像我在第一条评论中写的一样,我错过了其他的东西吗?

2 个答案:

答案 0 :(得分:3)

Lista没有返回List<string>,它会返回Task<List<string>>。在任务完成之前,您无法获取字符串列表。

您应该awaitLista返回任务,这将返回结果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,但编译器会完成所有操作,使其看起来像是一种方法。)

但是你不能在构造函数上做,构造函数必须同步返回值(新对象)。

(或者你可以说构造函数必须是方法而不是类。)