关于异步/任务的初学者

时间:2014-11-20 14:24:04

标签: c# asynchronous

看一下这段代码:

private async void Lista()
{
    var _folder = Windows.Storage.ApplicationData.Current.LocalFolder;
    var file = await _folder.GetFileAsync("thefile.txt");
    var read = await Windows.Storage.FileIO.ReadTextAsync(file);
}

由于代码块包含await,我需要在签名中使用async。这意味着我不能在最后添加“Retrun read”。 (这是我想从该方法中获得的。)

据我所知,我需要以某种方式使用任务。有关如何检索var read的任何提示?

3 个答案:

答案 0 :(得分:5)

您可以将退货类型更改为Task<string>

private async Task<string> Lista()
{
     var _folder = Windows.Storage.ApplicationData.Current.LocalFolder;
     var file = await _folder.GetFileAsync("thefile.txt");
     var read = await Windows.Storage.FileIO.ReadTextAsync(file);
     return read;
}

来自MSDN

  

异步方法的返回类型可以是TaskTask<TResult>void。 [...]   如果方法的return语句指定类型为TResult的操作数,则指定Task<TResult>作为异步方法的返回类型。如果方法完成时没有返回有意义的值,则使用Task。也就是说,对该方法的调用返回一个Task,但是当Task完成时,任何正在等待Task的await表达式计算为void。

答案 1 :(得分:3)

您需要将返回类型更改为Task T T,其中string是您的预期回复类型,在这种情况下为private async Task<string> Lista() { var _folder = Windows.Storage.ApplicationData.Current.LocalFolder; var file = await _folder.GetFileAsync("thefile.txt"); var read = await Windows.Storage.FileIO.ReadTextAsync(file); return read; }

{{1}}

答案 2 :(得分:0)

如果您将退货方式签名更改为

private async Task<T> Lista()

TReadTextAsync方法返回的类型,那么您应该能够返回它。 然后必须通过调用方法等待它。或者调用方法必须&#34;展开&#34;它使用.Result

假设ReadTextAsync返回string,您可以尝试这样的事情:

    private async Task<string> Lista()
    {
        var _folder = Windows.Storage.ApplicationData.Current.LocalFolder;
        var file = await _folder.GetFileAsync("thefile.txt");
        return await Windows.Storage.FileIO.ReadTextAsync(file);
    }