繁体   English   中英

无法在 GetAwaiter().GetResult() 上将类型“void”隐式转换为“object”

[英]Cannot implicitly convert type 'void' to 'object' on GetAwaiter().GetResult()

我们使用以下代码来等待方法执行,因为我们有必须使用异步方法的同步方法,这是我们在项目中使用的包装器

public dynamic RunTask(dynamic method) {
   var result = Task.Run(async () => await method).ConfigureAwait(false);
   return result.GetAwaiter().GetResult();
}

当方法具有返回类型时,这行代码似乎可以正常工作: Task< int > 但是今天当我编写非返回方法时,当 Task 没有返回值时它会抛出异常

   // throws exception in this case 'Cannot implicitly convert type 'void' to 'object'
   public async Task Run(){
        await //;
   }

   // Works
   public async Task<int> Fun(){
      return await //;
   }

从消息中,它显然无法将 void 分配给 object 但是我是否缺少一些东西,如何让它工作 void 任务。 我们正在使用 .net 内核 3.1。 任何帮助是极大的赞赏。

你在打电话吗 RunTask(); 该方法不返回任何内容? :)

首先这是一个不好的做法。 异步调用的最佳方式是遵循等待模式。 这是这样的

private Task MyMethodAsync(){

}


public async void Main(){
    await MyMethodAsync();
}

现在,如果它还没有到位,那么实现 await 模式可能会有点困难(因为它可能需要等待链中的所有调用)。 你能做的如下:

MyMethodAsync().Wait()

这将阻塞调用线程并等待任务完成。 因为它是无效的,所以你不会得到任何结果,这就是你首先得到这个异常的主要原因。

您可以根据自己的目的尝试此代码,但正如 Marc 建议的那样,这不是推荐的做法:

   public dynamic RunTask(dynamic method)
    {
       if (method is Task)
        {
            method.ConfigureAwait(false).GetAwaiter().GetResult();
            return 0;
        }
        else
        {
            var result = Task.Run(async () => await method).ConfigureAwait(false);
            return result.GetAwaiter().GetResult();
        }

    }

暂无
暂无

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

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