【问题标题】:Can't await a task after the fact事后不能等待任务
【发布时间】:2019-09-23 12:39:16
【问题描述】:

如何修复此任务/等待代码?我基本上是在调用一个稍后返回TaskAwaiting 的方法。首先,它说Awaited task returns no value 确实如此(无论如何对我来说)。然后它说它不能将void转换为int。怎么会?提前致谢。

class Program
    {
        static async void Main(string[] args)
        {

            var tsk = First();
            int mynumb = await tsk;
            return;

        }
        static async Task<int> First()
        {
            return 2;  
        }


    }

【问题讨论】:

  • 请问您可以编辑问题并直接分享代码吗?代码的屏幕截图对位于阻止图像共享站点的公司防火墙后的人以及具有可访问性要求的用户来说几乎没有用处。
  • 你的代码是废话。异步方法First 必须返回一个Task

标签: c# async-await task


【解决方案1】:

变量类型不正确。

改成这样:

Task<int> tsk = First();

或者只使用var 关键字

var tsk = First();

要删除警告,您需要使 First() 方法返回 Task&lt;int&gt;,如下所示

static Task<int> First()
{
    return Task.FromResult(2);
}

从上面的代码来看,似乎这些都不需要异步,所以如果是这种情况,你可能会在这里浪费你的时间。

【讨论】:

  • 只是对其他正确答案添加一个小细节:Task 用于不返回值的异步方法。 Task&lt;T&gt; 用于返回 T 值的异步方法。 await 查看任务的泛型类型 (T) 以定义其自己的返回类型(如果有)。因为您使用了Task,所以您的任务没有返回类型,它是void,因此您尝试将void 分配给您的int 变量,这会导致你得到的错误。
  • 谢谢。做到了。但是我仍然有警告消息说This async method lacks 'await' operators and will run synchronously. Consider using the 'await' operator to await non-blocking API calls, or 'await Task.Run(...)' to do CPU-bound work on a background thread.(First() 下的绿线)。我该如何摆脱它?
  • 感谢@Flater。 @Zuzlx 警告是因为您的 First() 方法本质上不是异步的。您返回的是 int 而不是 Task&lt;int&gt;。您可以使用return Task.FromResult(2); 删除该警告
  • @JamieRees 感谢所有帮助。当我更改为return Task.FromResult(2) 时,我得到CS4016 Since this is an async method, the return expression must be of type 'int' rather than 'Task&lt;int&gt;'
  • 当方法定义为async时,你可以做return 2;Task.FormResult 仅在您删除 async 时才有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-10
  • 1970-01-01
  • 2013-08-06
  • 2021-08-14
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多