私は、観測可能な複数のイベントを、Rxを使って1組のイベントにどのようにストリーミングできるかを調べようとしています。しかし、以下のコードを実行すると例外が発生します。これは、Rx文法違反のために複数のオブザーバが常に例外になりやすいということですか?つまり、複数の観測者のうちの2人が同時に偶然にイベントを生成した場合(いずれの2つの観測も同時に発生する可能性があります)、例外が発生します。観測者はRxで複数の観測値を安全に聞くことができますか?
DateTimeOffset start;
object sync = new object();
var subject = new Subject<long>();
var observer = Observer.Create<long>(c =>
{
lock (sync)
{
Console.WriteLine(c);
}
})
;
var observable1 = Observable.Interval(TimeSpan.FromSeconds(2));
var observable2 = Observable.Interval(TimeSpan.FromSeconds(5));
var observable3 = Observable.Never<long>().Timeout
(start = DateTimeOffset.Now.AddSeconds(15),
(new long[] { 1 }).ToObservable());
var observable4 = Observable.Never<long>().Timeout(start);
observable1.Subscribe(observer);
observable2.Subscribe(observer);
observable3.Subscribe(observer);
observable4.Subscribe(observer);
Thread.Sleep(20000);
ギデオンの説明に感謝します。これは私が得ている例外です。あなたは時間切れの例外であるということは間違いありません。これはコーディングミスでした。ありがとう。
System.TimeoutException: The operation has timed out.
at System.Reactive.Observer.<Create>b__8[T](Exception e)
at System.Reactive.AnonymousObserver`1.Error(Exception exception)
at System.Reactive.AbstractObserver`1.OnError(Exception error)
at System.Reactive.Subjects.Subject`1.OnError(Exception error)
at System.Reactive.AnonymousObservable`1.AutoDetachObserver.Error(Exception e
xception)
at System.Reactive.AbstractObserver`1.OnError(Exception error)
at System.Reactive.AnonymousObservable`1.AutoDetachObserver.Error(Exception e
xception)
at System.Reactive.AbstractObserver`1.OnError(Exception error)
at System.Reactive.Linq.Observable.<>c__DisplayClass28c`1.<>c__DisplayClass28
e.<Throw>b__28b()
at System.Reactive.Concurrency.Scheduler.Invoke(IScheduler scheduler, Action
action)
at System.Reactive.Concurrency.ImmediateScheduler.Schedule[TState](TState sta
te, Func`3 action)
at System.Reactive.Concurrency.Scheduler.Schedule(IScheduler scheduler, Actio
n action)
at System.Reactive.Linq.Observable.<>c__DisplayClass28c`1.<Throw>b__28a(IObse
rver`1 observer)
at System.Reactive.AnonymousObservable`1.<>c__DisplayClass1.<Subscribe>b__0()
at System.Reactive.Concurrency.Scheduler.Invoke(IScheduler scheduler, Action
action)
at System.Reactive.Concurrency.ScheduledItem`2.InvokeCore()
at System.Reactive.Concurrency.ScheduledItem`1.Invoke()
at System.Reactive.Concurrency.CurrentThreadScheduler.Trampoline.Run()
at System.Reactive.Concurrency.CurrentThreadScheduler.Schedule[TState](TState
state, TimeSpan dueTime, Func`3 action)
at System.Reactive.Concurrency.CurrentThreadScheduler.Schedule[TState](TState
state, Func`3 action)
at System.Reactive.Concurrency.Scheduler.Schedule(IScheduler scheduler, Actio
n action)
at System.Reactive.AnonymousObservable`1.Subscribe(IObserver`1 observer)
at System.Reactive.Linq.Observable.<>c__DisplayClass543`1.<>c__DisplayClass54
5.<Timeout>b__53f()
at System.Reactive.Concurrency.Scheduler.Invoke(IScheduler scheduler, Action
action)
at System.Reactive.Concurrency.ThreadPoolScheduler.<>c__DisplayClass8`1.<Sche
dule>b__6(Object _)
at System.Threading._TimerCallback.TimerCallback_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, C
ontextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading._TimerCallback.PerformTimerCallback(Object state)