GetAwaiter() Method

本文关键字:Method GetAwaiter | 更新日期: 2023-09-27 18:07:45

我有一个像这样的顶层函数

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

client是我自己的函数,它做了很多事情。(与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函数确实执行,但我得到一个错误,只要我从它返回。

我已经尝试了一堆不同的东西,但没有工作。我做错了什么?

GetAwaiter() Method

Task不是一个服务员,它是一个等待对象。这意味着你不能从你的GetAwaiter方法返回它——它不适合契约。

如果您真的想这样做(我真的不明白这一点),请确保您的GetAwaiter实际上返回一个await:

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

这将返回您的查询对象和结果作为元组的两个单独的属性-当然,您可以使用您喜欢的任何其他类型。然而,我还是强烈建议你重新考虑一下你现在的设计——它看起来就像一到两年后会让你头疼的那种。