public static Future <Pair <A, B> > Zip <A, B>(this Future <A> future, Future <B> other) { return(Future.Async <Pair <A, B> >(cb => { var latch = new CountdownEvent(2); var resA = default(A); var resB = default(B); Action next = () => { latch.Wait(); cb(Pair.Create(resA, resB)); }; future.RunAsync( a => { resA = a; latch.Signal(); next(); }); other.Callback( b => { resB = b; latch.Signal(); }); }, future.Strategy)); }