c# - 是否可以从 TPL Task 派生以从方法返回更多详细信息?

标签 c# .net asynchronous async-await task-parallel-library

我原来的方法是这样的:

string DoSomeWork();

方法 DoSomeWork 在另一个线程上开始一些工作并返回执行 ID(只是随机字符串)。稍后我可以通过返回的执行 ID 查询结果。要点是在作业完成之前使执行 ID 可用。

现在我想更改签名以返回Task,这样用户可以根据需要等待。

Task DoSomeWork();

与此同时,我仍然需要返回执行 ID(例如用于跟踪目的)并且我看到了一些选项。首先,使用 out 参数,其次,返回包含执行 ID 和任务的元组(在 C# 中,这看起来不是最佳选择),第三,我实际上想问一下。

如果我创建一个派生 Task 的类会怎样:

public class ExtendedTask : Task
{
     public string ExecutionID {get; set;}
}

这样好看吗?还是决定其他选择更好?

附言在 BCL 中,有一些派生自 Task 的类。

UPDATE,看来我没能把它定义得足够清楚。但是我需要在作业完成之前访问 ExecutionID,所以我不能使用 Task.Result

最佳答案

我个人不会延长 Task<T> ,我会编写它。这样你就不需要担心任何只返回 Task<T> 的 API。 - 你可以把任务包装起来。您可以拥有一个公开底层任务的属性,并且为了 C# 5 异步目的,您可以在您自己的类型上实现等待者模式——但我觉得创建您自己的派生类型是 可能弊大于利。不过,这主要是一种直觉。

另一种选择是反过来:将额外状态存储在 Task.AsyncState 中属性(property);毕竟,这就是它的用途。这样您就可以轻松地传递任务,而不会丢失它在逻辑上属于其中的执行上下文。

关于c# - 是否可以从 TPL Task 派生以从方法返回更多详细信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9265327/

相关文章:

asynchronous - Flutter: future 和共同偏好

asynchronous - 在回流中排队异步操作

c# - 如何在 Windows 8.1 App 中使用地理编码?

c# - 在mvc中创建 View

c# - ExecuteReader等待操作超时错误

c# - WPF 错误还是我要疯了?

.net - 在 GDI 中绘制图层

javascript - 如何使 $http.get 返回响应而不是 promise 对象?

c# - SciChart FastLineRenderableSeries 抗锯齿不起作用

c# - 无法从 web api POST 读取正文数据