我正在编写一个通用的Future<T>
类,它封装了异步获取值,我注意到Web上的大多数现有实现都有这样的契约:
public class Future<T>
{
public Future(Func<T> func); // kicks off the async operation
public T Value { get; } // gets the value and blocks if the async operation isn't done
}
这立即让我想要在实现中添加一个Completed事件,以便在我想获取值async并知道它何时完成时我不必轮询该值。我注意到并行编程库以这种方式实现了期货,但我很好奇为什么很多实现都没有这个事件。我错过了什么吗?期货是否有完成事件?或者它只取决于你的背景?
答案 0 :(得分:3)
我认为将这样的事件作为事件或a method that accepts delegate to the continuation在通用Future<T>
中很有用。如果您是为了特定目的而构建它,则可能没有必要。
此外,请记住,网络上的示例通常只是那样,而不是生产质量的代码,它们可能会错过那些不是必需但仍然有用的功能,例如此功能。
需要注意的另一件事是,您的工作可能根本不需要,因为此功能已经在Task<T>
的框架中。
答案 1 :(得分:2)
我认为这样做有点混淆了未来的概念。在我看来,期货的全部意义在于它们允许您使用在其他顺序样式代码中异步计算的值。如果需要更明显的异步风格,那就是延续传递的目的。
那就是说,我倾向于过于高傲并不是一种抱怨。 .NET的Task类结合了对这两种样式的支持,到目前为止我对它非常满意。我确实尝试将这两种风格分开:如果我计划强制执行任务,那么我宁愿避免为其分配任何延续,反之亦然。