Animation C使用反应式扩展(Rx)的顺序动画

Animation C使用反应式扩展(Rx)的顺序动画,animation,system.reactive,sequential,Animation,System.reactive,Sequential,我尝试使用RX编写一个类来管理动画序列。不幸的是,我发现它不起作用,当我调试它时,我发现我总是得到_sequence的值为null;似乎没有返回结果。我怀疑AnimationSequence方法有错误。但我不确定,有专家能帮我吗 public class AnimationManager : IDisposable { private IDisposable _sequence; private ISequentialResult _result; private r

我尝试使用RX编写一个类来管理动画序列。不幸的是,我发现它不起作用,当我调试它时,我发现我总是得到_sequence的值为null;似乎没有返回结果。我怀疑AnimationSequence方法有错误。但我不确定,有专家能帮我吗

 public class AnimationManager : IDisposable
{
    private IDisposable _sequence;
    private ISequentialResult _result;

    private readonly List<Func<IObserver<ISequentialResult>, ISequentialResult, ISequentialResult>> _animationQueue
        = new List<Func<IObserver<ISequentialResult>, ISequentialResult, ISequentialResult>>();


    public void AddAnimation(Func<IObserver<ISequentialResult>, ISequentialResult, ISequentialResult> sequence)
    {
        _animationQueue.Add(sequence);
    }

    public void Run(Action<Exception> exception, Action<ISequentialResult> completed)
    {

        var sequence = AnimationSequence().ToObservable();

        _sequence = sequence.Subscribe(
            next => { },
            exception,
            () => completed(_result));
    }

    private IEnumerable<IObservable<Object>> AnimationSequence()
    {
        var x = 0;

        _result = new DefaultSeqResult(null) { Value = this };
        while (x < _animationQueue.Count)
        {
            var sequence = _animationQueue[x];


            var step = Observable.Create<ISequentialResult>(
                observer =>
                {
                    var newResult = sequence(observer, _result);
                    newResult.Results.Add(_result);
                    newResult.Results.AddRange(_result.Results);
                    _result = newResult;
                    return () => { };
                }
                );
            yield return step;

            x++;
        }

        _result.Results.Add(_result);
    }

    public void Dispose()
    {
        if (_sequence != null) _sequence.Dispose();
    }

}
_在Subscribe返回之前,sequence不会获取值。由于您订阅的是IEnumerable.ToObservable,Subscribe在返回之前会完全迭代枚举。实际上,Run将一直阻塞,直到处理完整个序列

其次,您订阅的是一个IObservable。但是你从来没有迭代过内部序列,所以它们从来没有真正做过任何事情。这可能就是你所说的“它不起作用”的意思

如果要按顺序运行内部序列,请执行以下操作:

var sequence = AnimationSequence().Concat();
var sequence = AnimationSequence().Merge();
如果要并行运行内部序列,请执行以下操作:

var sequence = AnimationSequence().Concat();
var sequence = AnimationSequence().Merge();

这两种方法都能成功。

我不确定你在这里想要实现什么。在运行过程中,您将IEnumerable转换为IObservable,只需立即订阅即可。在我看来,这只是一种不必要的迂回方式,可以立即迭代IEnumerable,而foreach循环的可读性要高得多。您还可以忽略该IEnumerable中的所有数据,因为您的OnNext处理程序是空的,而是读取以某种方式填充到其他地方的_result成员变量,这使得将该IEnumerable放在首位毫无意义。