【问题标题】:Is it possible to get the Task object that is returned from an async function, INSIDE that function?是否可以在该函数内部获取从异步函数返回的 Task 对象?
【发布时间】:2019-08-06 20:15:09
【问题描述】:

作为标题。假设我有一个函数:

async Task Foo()
{
    // get Task obj that will be returned from this function
}

是否可以获得对该任务对象的引用?

我之所以对此感到好奇,是因为我希望能够跟踪一些任务。

【问题讨论】:

  • 你能把这个逻辑移到一个新的InnerFoo吗?然后使用来自FooInnerFooTask
  • 我希望能够跟踪某些任务是什么意思?如果 Foo 中的任务处于等待状态,则 Foo 返回的任务将在该任务完成之前完成。
  • 你不能字面上这样做,因为编译器生成的代码直到最后才会真正产生任务——所以,在一个非常真实的意义上,有 is 方法内没有Task 对象。可能有许多替代方法可以实现您想要的,但这需要退后一步并详细说明您的实际情况。
  • @juharr:我不想在函数内等待任务,只需将其添加到拥有该函数但不是函数调用者的同一类内的列表中。但我现在要走另一条路:-)。感谢 cmets!

标签: c# async-await task


【解决方案1】:

从函数返回的Task是从await Boo()生成的(如果内部工作由函数Boo完成) 所以你可以使用:

Task booTask = Boo();

没有await 来完成该任务。

【讨论】:

  • 不幸的是,对于一些极端情况,例如 ValueTask 和 Custom Awaiters,情况并非如此
  • @user1781290 :通常,异步方法返回在某处创建的任务,因此您可以保存创建的任务而不是使用await
  • 异步方法通常不会显式返回任务,而是隐式返回。仍然我的观点是,在某些情况下,您 await 的对象不是 Task
猜你喜欢
  • 1970-01-01
  • 2020-06-28
  • 1970-01-01
  • 1970-01-01
  • 2019-02-10
  • 2013-05-31
  • 2019-12-25
  • 2021-02-23
  • 1970-01-01
相关资源
最近更新 更多