我有像这样的顶级功能
var results = await client
.For(x.Offices)
.Select(x.NumberOfFlores, x.Hight)
.QueryAsync();
客户端是我自己的功能,可以做很多事情。 (与ODataClient Client类不同)
QueryAsync()
的结果返回自定义类。该类有几个参数,其中一个是queryResults。这个类有一个GetAwaiter()
函数,它永远不会正常工作。
public async Task GetAwaiter()
{
await queryResults;
}
queryResults
是Task<IEnumerable<ODataEntry>>
我想要它做的是等待queryResults执行,所以我可以在results.QueryResults
但是,在“await queryResults”
之后我收到此错误无法投射类型的对象 'System.Threading.Tasks.Task`1 [System.Threading.Tasks.VoidTaskResult]' 输入'System.Runtime.CompilerServices.INotifyCompletion'。
getAwaiter
函数确实执行了,但是一旦我从它返回就会收到错误。
我尝试了很多不同的东西,但没有任何作用。我做错了什么?
答案 0 :(得分:1)
Task
不是等待者,是等待的。这意味着您无法从GetAwaiter
方法返回它 - 它不符合合同。
如果你真的想走这条路(而且我真的不明白这一点),请确保你的GetAwaiter
实际返回了一个等待者:
public TaskAwaiter<IEnumerable<ODataEntry>> GetAwaiter()
{
return queryResults.GetAwaiter();
}
修改强>
如果要返回不同类型的任务,则需要返回不同类型的任务 - 没有办法绕过它。这是一个糟糕的设计,但你可以做这样的事情:
public TaskAwaiter<Tuple<YourObject, IEnumerable<ODataEntry>>> GetAwaiter()
{
return
queryResults
.ContinueWith(t => Tuple.Create(this, t.Result))
.GetAwaiter();
}
这将返回您的查询对象和结果作为元组的两个独立属性 - 当然,您可以使用您想要的任何其他类型。但是,我仍然强烈建议重新考虑你当前的设计 - 它看起来就像是在一两年内让你头疼的那种。