繁体   English   中英

异步方法的返回类型

[英]Return Type of an async method

我在C#中有一个异步方法,如下所示:

public async Task<string> GetData(int id)
        {
        Task<string> inp =  CommonMethod(id);
        return inp;
}

  public async Task<string> CommonMethod(int id)
        {
        string output ;
        output = await service.GetSomeDummyData(id);
        return output;
}

我收到一条错误消息,因为“由于这是一个异步方法,所以返回表达式必须是字符串类型,而不是'Task'类型

所以,我将返回类型转换为:

public async Task<string> GetData(int id)
        {
        Task<string> inp =  CommonMethod(id);
        return inp.ToString();
}

该代码已成功编译。

我是异步编程的新手,以上转换方法是返回字符串的最佳实践吗? 因为从CommonMethod中 ,我将在Task<string>收集返回类型,而在下inp.Tostring()语句中,我将使用inp.Tostring() 使用正确的返回类型有点困难。

当您将async修饰符添加到方法中时,您是在告诉编译器自动将其返回值包装为Task。 或者说,一系列任务在每个await语句上彼此连续,松散地说。 所以你的代码:

public async Task<string> GetData(int id)
{
    Task<string> inp =  CommonMethod(id);
    return inp;
}

会编译成类似以下内容的东西:

public Task<string> GetData(int id)
{
     return Task.Run() => 
     {
         Task<string> inp =  CommonMethod(id);
         return inp; 
     }
}

因此,您要返回的内容不是Task<string> ,而是Task<Task<string>> -一个返回另一个Task(然后返回字符串)的Task,该Task与方法签名不匹配。

因此,您要做的就是删除async修饰符并直接返回内部任务:

public Task<string> GetData(int id)
{
    Task<string> inp =  CommonMethod(id);
    return inp;
} 

它将起作用,并返回内部CommonMethod任务,或者添加内部await语句以在内部任务的结果之上返回一个新Task:

public async Task<string> GetData(int id)
{
    string inp =  await CommonMethod(id);
    return inp;
}

它再次宽松地在到达await语句时立即返回任务, 其后的代码( return语句)位于内部任务的ContinueWith块中。 内部任务完成后, await代码将运行,并返回结果作为先前返回的原始Task的结果。

您应该这样做:

public async Task<string> GetData(int id)
{
    string inp = await CommonMethod(id);
    return inp;
}

与您在第二个通话中使用的方法相同。 返回的值将自动包装在Task中。

因为您将Task作为返回类型,并且已在代码中手动将其打包在Task中,所以它在此处引发了错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM