【问题标题】:Get the current Task instance in an async method body在异步方法体中获取当前任务实例
【发布时间】:2018-12-30 20:08:02
【问题描述】:

如果我有这样的异步方法体 -

public async Task GetSomething() {

    await SendText("hi");
    await SendImage("bla.bmp");

}

当等待启动时​​,如何在将 Task 对象返回给用户之前获取它

即..

public async Task GetSomething() {

    myTasks.Add(Task.Current);
    await SendText("hi");
    await SendImage("bla.bmp");

    //some processing

}

这样我就可以在其他地方做

 await Task.WhenAll(myTasks);
 Console.WriteLine("All tasks complete");

这样我就可以在关闭之前等待所有任务完成

【问题讨论】:

  • SendTextSendImage 的签名是什么?
  • 没什么区别。这只是一些显示 GetSomething 执行多个子操作的虚拟代码。如果它更清楚,请用 Thread.Sleep(50000) 替换它们。
  • 是的。方法可以返回voidTaskTask<T>,如果是Task或者Task<T>可以重构代码。您可以获取任务对象并将它们添加到单个数组中。
  • 但是我想要收集的不是内部任务,而是我想要的顶级任务。可能有 10 多个内部任务,我不希望每次开始时都将它们添加到列表中。那会很混乱。

标签: c# .net asynchronous


【解决方案1】:

这是不可能直接实现的,因为该语言没有访问“当前”任务的工具。

不过有一个解决方法:将您的异步方法包装在另一个方法中。一旦异步方法返回(这大约发生在第一个等待点),这个 other 方法可以获取任务。

在所有情况下,我都建议让调用者将异步任务添加到您的列表中,而不是异步方法本身。即使从封装的角度来看,这也很有用。

【讨论】:

  • 看来你是对的。我不知道这是否意味着我做错了什么,或者以前没有考虑过这样的用例。我原以为跟踪所有异步方法会很常见。我想我将不得不通过将我的代码包装在一个内部函数中来丑化它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多