【问题标题】:Why does this async function expect a return value为什么这个异步函数需要一个返回值
【发布时间】:2019-10-28 08:46:29
【问题描述】:

我有一个功能如下:

public static async Task<bool> DoSomething()
{
    await Task.Run(() =>
    {
        //do something that takes a long time
        bool success = ALongFunction();
        return success;
    });
}

上面的代码无法编译,因为它期望等待后的返回值。为什么是这样?任务中的代码在所有执行路径上都返回一个值,我认为等待之后的返回应该由等待机制处理。我应该在上面返回什么?我是否必须这样做:

public static async Task<bool> WriteMonitor(string filename, IMonitorAsync monitorAsync)
{
    bool success = false;
    await Task.Run(() =>
    {
        //do something that takes a long time
        success = ALongFunction();
    });
    return success;
}

上面确实可以编译,但我希望顶部代码也可以编译。

【问题讨论】:

  • 在你的第一个代码块中,return 语句属于Task.Run() 使用的Func。您的外部方法不返回任何内容。这就像在嵌套循环中使用break;;你不希望跳出外循环,是吗?
  • 试试return await Task.Run(() =&gt; ;)
  • @Fildor 显然!多哈。随意回答,我会将其标记为答案。我相信将来会有其他人这样做......
  • 我很想知道为什么我投了反对票。上述问题的哪些方面不符合论坛规则?

标签: c# async-await return


【解决方案1】:

您返回一个bool 值,而您的方法实际上返回一个Task&lt;bool&gt;

更改方法以返回等待的Task

return await Task.Run(...);

【讨论】:

  • 您的代码是正确的,但您的第一句话是错误的;这不是错误的原因。因为该方法标有async 修饰符,所以您实际上需要从方法内部返回一个bool(它被包裹在Task&lt;bool&gt; 中)。编译器错误的原因是该方法返回任何东西。阅读我对上述问题的评论了解更多信息。
  • 其实你对应该发生的事情的描述(第二句)也是错误的。您没有返回任务;您正在返回等待任务返回的 bool 值。所以,你仍然返回bool
【解决方案2】:

在当前形式中,函数只返回一个任务(不是Task&lt;bool&gt;)。

public static async Task<bool> DoSomething()
{
    await Task.Run(() =>
    {
        return AFunctionThatTakesALongTime();
    });
}

相当于下面的sn-p:

public static async Task<bool> DoSomething()
{
    bool r = await Task.Run(() =>
    {
        return AFunctionThatTakesALongTime();
    });
    // not returning r
}

解决方案

return await Task.Run(() => ...)

【讨论】:

  • "你的函数的返回值是Task&lt;bool&gt;,所以你必须返回Task&lt;bool&gt;。" - 这不是完全正确的。由于函数标记为async,因此它必须在方法内返回bool。调用该函数的代码会将其视为Task&lt;bool&gt;,但在内部它只是返回bool
  • @enigmativity 我不同意你对我所写内容的解释,但删除了该声明。
  • 你有什么不同意见?
  • 返回类型为Task&lt;bool&gt;并标有async的方法返回Task&lt;bool&gt;,但它包含操作数类型为bool的返回语句。
  • 另外,'returns a Task' 是整个 Microsoft Docs 在谈论此类方法时使用的语言。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-31
  • 1970-01-01
  • 1970-01-01
  • 2020-12-25
  • 2019-03-10
  • 2018-12-28
相关资源
最近更新 更多