1

我正在编写一个通用Future<T>类,它封装了异步获取值,我注意到网络上大多数现有的实现都有这样的合同:

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 事件,这样当我想要异步获取值并知道它何时完成时,我不必轮询该值。我注意到并行编程库以这种方式实现期货,但我很好奇为什么很多实现都没有这个事件。我错过了什么吗?Futures 是否应该有 Completed 事件?还是仅取决于您的上下文?

4

2 回答 2

3

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

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

另一件需要注意的是,您的工作可能根本不需要,因为此功能已经以Task<T>.

于 2011-06-27T20:49:52.807 回答
2

我认为这样做在某种程度上混淆了期货的概念。在我看来,future 的全部意义在于它们允许您使用在其他顺序样式代码中异步计算的值。如果需要更明显的异步风格,那么这就是延续传递的目的。

也就是说,这不是我倾向于过于自负的抱怨。.NET 的 Task 类结合了对这两种样式的支持,到目前为止,我对它非常满意。不过,我确实尝试将这两种样式分开:如果我打算强制执行任务,那么我宁愿避免为其分配任何延续,反之亦然。

于 2011-06-27T22:57:02.863 回答