0

我有这样的顶级功能

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

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

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

public async Task GetAwaiter()
{
        await queryResults;
}

queryResults是类型的对象 Task<IEnumerable<ODataEntry>>

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

但是,我在“等待查询结果”之后收到此错误

无法将“System.Threading.Tasks.Task`1[System.Threading.Tasks.VoidTaskResult]”类型的对象转换为“System.Runtime.CompilerServices.INotifyCompletion”。

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

我尝试了很多不同的东西,但没有任何效果。我究竟做错了什么?

4

1 回答 1

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

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

于 2015-08-14T05:16:51.167 回答