2016-11-21 117 views
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; 
} 

我得到的错误消息作为“。由于这是一个异步的方法,所述返回表达式必须是字符串类型的而不是“任务”

SO,我转换作为返回类型:

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

的代码被成功地得到遵守

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

回答

3

你还是做这种方式:

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

你做你的第二个电话一样。 返回的值将自动包含在Task中。

因为你有Task作为你的返回类型,并且你已经在代码中手工将它打包在Task中,所以它在那里抛出一个错误。

+2

确切!甚至是'返回等待CommonMethod(id);' – Yasser

1

当您向该方法添加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>> - 返回另一个任务的任务(然后返回字符串),这与方法签名不匹配。

所以,你想要做什么或者是下降的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; 
} 

这又松散,返回任务立即当等待语句在块之后的代码(return语句)之后的代码被覆盖到内部任务上。内部任务完成后,运行await之后的代码,并返回结果作为之前返回的原始任务的结果。