[英]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.