Подпишись на наблюдаемую и жду позже - PullRequest
0 голосов
/ 23 ноября 2018

Следующее НЕ БУДЕТ поймать испущенное значение:

someObservable = Observable.FromEventPattern(this, "MyEvent");
FireMyEvent("foo");
await someObservable.FirstOrDefaultAsync(e => e.Args == "foo");

Так что я сталкивался с этим шаблоном в своих модульных тестах:

var tsc = new TaskCompletionSource<bool>();

var callback = someObservable.FirstOrDefaultAsync(...);

using (callback.Subscribe(e => tsc.SetResult(e.Args)))
{
    FireMyEvent("foo");
    tsc.Task.Wait(1000);
}
Assert.AreEqual("foo", tsc.Task.Result);

В основном мне нужно подписаться, затем вызватьдействие, а затем ждать подписку наблюдаемой.

Можно ли упростить эту подписку / ожидание, не вводя новую задачу или WaitHandle?

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018
  1. Я не совсем понимаю ваше предположение, что ожидание не поймает результат.
  2. Вам нужно дождаться события, прежде чем оно будет запущено

someObservable = Observable.FromEventPattern(this, "MyEvent"); Task.Delay(1000).ContinueWith(_ => FireMyEvent("foo")); var result = await someObservable.FirstOrDefaultAsync(e => e.Args == "foo");

Ваш результат теперь EventPattern.Однако я бы порекомендовал более безопасный тип FromEventPattern-Overload:

var eventObservable = Observable
            .FromEventPattern<YourEventArgs>(
                h => MyEvent += h,
                h => MyEvent -= h);
0 голосов
/ 23 ноября 2018

Я не уверен, что именно вы пытаетесь сделать, но если я понимаю основную идею, то это работает:

var subject = new Subject<Unit>();

var callback = subject.FirstOrDefaultAsync();

using (callback.Subscribe(_ => { }, () => Console.WriteLine("Done.")))
{
    subject.OnNext(Unit.Default);
}

Можете ли вы объяснить свой вариант использования более полно?

...