GetAwaiter()方法

时间:2015-08-13 20:05:45

标签: c# asynchronous simple.odata

我有像这样的顶级功能

          var results = await client
                .For(x.Offices)
                .Select(x.NumberOfFlores, x.Hight)
                .QueryAsync();

客户端是我自己的功能,可以做很多事情。 (与ODataClient Client类不同)

QueryAsync()的结果返回自定义类。该类有几个参数,其中一个是queryResults。这个类有一个GetAwaiter()函数,它永远不会正常工作。

public async Task GetAwaiter()
{
        await queryResults;
}

queryResultsTask<IEnumerable<ODataEntry>>

类型的对象

我想要它做的是等待queryResults执行,所以我可以在results.QueryResults

的形式中使用它

但是,在“await queryResults”

之后我收到此错误
  

无法投射类型的对象   'System.Threading.Tasks.Task`1 [System.Threading.Tasks.VoidTaskResult]'   输入'System.Runtime.CompilerServices.INotifyCompletion'。

getAwaiter函数确实执行了,但是一旦我从它返回就会收到错误。

我尝试了很多不同的东西,但没有任何作用。我做错了什么?

1 个答案:

答案 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();
}

这将返回您的查询对象和结果作为元组的两个独立属性 - 当然,您可以使用您想要的任何其他类型。但是,我仍然强烈建议重新考虑你当前的设计 - 它看起来就像是在一两年内让你头疼的那种。