我的通用Future实现是否应该有一个Completed事件

本文关键字:有一个 Completed 事件 是否 Future 实现 我的 | 更新日期: 2023-09-27 18:00:26

我正在编写一个通用的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并知道它何时完成时,就不必轮询该值了。我注意到并行编程库以这种方式实现未来,但我很好奇为什么很多实现都没有这个事件。我是不是错过了什么?期货是否应该有Completed事件?还是仅仅取决于你的背景?

我的通用Future实现是否应该有一个Completed事件

我认为在通用Future<T>中,将这样的东西作为一个事件或一个接受延续委托的方法是有用的。如果你只是为了一个特定的目的而建造它,那么它可能没有必要。

此外,请记住,网络上的示例通常只是这样,而不是生产质量的代码,它们可能会错过一些不是真正必要但仍然有用的功能,比如这个。

另一件需要注意的事情是,您的工作可能根本没有必要,因为该功能已经以Task<T>的形式存在于框架中。

我认为这样做在一定程度上混淆了未来的概念。在我看来,未来的全部意义在于,它们允许您在其他顺序风格的代码中使用异步计算的值。如果需要更公开的异步风格,那么延续传递就是为了这个。

也就是说,这并不是我倾向于过于傲慢的抱怨。NET的Task类结合了对这两种样式的支持,到目前为止我对此非常满意。不过,我确实尝试将这两种风格分开:如果我计划强制执行Task,那么我更喜欢避免为其分配任何延续,反之亦然。