关于异步/任务的初学者

本文关键字:任务 初学者 异步 于异步 | 更新日期: 2023-09-27 18:31:07

看看这段代码:

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的任何提示?

关于异步/任务的初学者

您可以将返回类型更改为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,但是当任务完成时,等待任务的任何 await 表达式的计算结果都将变为 void。

您需要

将返回类型更改为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;
}

如果将返回方法签名更改为

private async Task<T> Lista()

其中T是方法返回的类型ReadTextAsync那么您应该能够返回它。然后,必须通过调用方法等待它。或者调用方法必须使用 .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);
    }