0
AsycSubject<Unit>() sub;
// stuff
if(!sub.HasFired())
  // Do stuff

現在の最善の試みは次のとおりです。

public static bool HasFired<T>(this AsyncSubject<T> sub)
{
    AsyncSubject<bool> ret = new AsyncSubject<bool>();
    sub.Timeout(TimeSpan.FromMilliseconds(20))
        .Subscribe(_ =>
            {
                ret.OnNext(true);
                ret.OnCompleted();
            },
            ex => 
            {
                ret.OnNext(false);
                ret.OnCompleted();
            });
    return ret.First();
}

しかし、それは非常に醜く、長く感じます。私は単純なものが欠けていると思います。助言がありますか?

4

1 に答える 1

1

既存のものをラップしてAsyncSubject、必要な状態を追加する方が簡単です。

public class AsyncSubjectEx<T> : ISubject<T>, IDisposable
{
    AsyncSubject<T> Subject = new AsyncSubject<T>();

    public bool HasValue { get; protected set; }

    public object Gate = new object();

    public void OnCompleted()
    {
        Subject.OnCompleted();
    }

    public void OnError(Exception error)
    {
        Subject.OnError(error);
    }

    public void OnNext(T value)
    {
        lock (Gate)
        {
            Subject.OnNext(value);
            HasValue = true;
        }
    }

    public IDisposable Subscribe(IObserver<T> observer)
    {
        lock (Gate)
            return Subject.Subscribe(observer);
    }

    public void Dispose()
    {
        Subject.Dispose();
    }
}

皮肉なことに、オリジナルAsyncSubjectを反射するとhasValueフィールドがあることが示されますが、たまたま露出していません。これを Rx チームに報告することを検討してください - いつか役立つかもしれません。

于 2012-08-11T06:49:38.313 に答える