返回异步方法的类型

时间:2016-11-21 06:16:25

标签: c# .net asynchronous c#-4.0

我在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;
}

我收到错误消息为&#34;由于这是异步方法,因此返回表达式必须是字符串而不是&#39;任务&#39;

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

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

代码已成功编译。

我是异步编程的新手,上面的转换方法是返回字符串的最佳做法吗?因为来自 CommonMethod , 我正在收集Task<string>中的返回类型,并在下一个语句中使用inp.Tostring()。使用正确的返回类型的一点困境。

2 个答案:

答案 0 :(得分:4)

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,它与方法签名不匹配。

所以你要做的就是删除async修饰符并直接返回内部任务:

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

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

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

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

答案 1 :(得分:3)

你应该这样做:

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

与第二次通话中的方式相同。 返回的值将自动包含在Task中。

因为你有一个Task作为你的返回类型,并且你已经在你的代码中手动将它打包在任务中,所以它在那里引发了一个错误。