I am struggling with some concurrency issues related to subscribing Observable.FromEventPattern()to TaskPoolScheduler.
Let me illustrate a sample code:
var dataStore = new DataStore();
Observable.FromEventPattern<DataChangedEventArgs>(dataStore, nameof(dataStore.DataChanged))
.SubscribeOn(TaskPoolScheduler.Default)
.Select(x => x.EventArgs)
.StartWith(new DataChangedEventArgs())
.Throttle(TimeSpan.FromMilliseconds(25))
.Select(x =>
{
Thread.Sleep(5000);
var result = 42;
return result;
})
.ObserveOn(new SynchronizationContextScheduler(SynchronizationContext.Current))
.Subscribe(result =>
{
dataStore.RaiseDataChangedEvent();
});
dataStore.RaiseDataChangedEvent();
dataStore.RaiseDataChangedEvent();
My problem is that when any new elements are emitted by the original observable Observable.FromEventPattern()(i.e. when the object DataStoretriggers new events DataChanged), then they seem to be blocked, waiting for the end of the previous elements flowing through the pipeline.
Since subscribing is done on TaskPoolScheduler, I expected every new item to be released to just deploy a new task, but in fact the source of the event instead is blocked when the event is called, if the pipeline is busy.
, ( ) /, DataChangedEvent.Invoke()?
( , , Subscribe() , - .)
: @jonstodle #rxnet Slack, TaskPoolScheduler , . , , , , , . , , ( ). , , , , , ?