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



我尝试用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();
    }
}
_sequence

Subscribe()返回之前不会获得值。 而且由于您正在订阅IEnumerable.ToObservable()Subscribe最终会在返回之前完全迭代可枚举。 实际上,Run将阻塞,直到处理整个序列。

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

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

var sequence = AnimationSequence().Concat();

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

var sequence = AnimationSequence().Merge();

其中任何一个都应该让它"走"。

相关内容

  • 没有找到相关文章

最新更新