пересечении условий надо стартануть две таски в фоне. Тут как бы все просто. Потоки событий довольно интенсивные и необходимые условия для запуска тасков могут возникать довольно часто, а вот таски эти мне надо стартануть, и не запускать новые, пока предыдущие не отработают, так как новые просто завалят ошибками. Я присобачил две`bool` переменных, которые служат индикаторами, что таск запущен (то есть при старте соответствующего таска они устанавливаются в true, при завершении - в false ) . Что скажете на счет такой конструкции?
if(IsFirstTaskRunning)
return;
SemaphoreSlim используй, там асинхронная блокировка WaitAsync пока не вызовется Release. И можно даже указать таймаут и CancellationToken
Смотри в стророну AsyncCollection
Выглядит как классическая задача для Rx ExhaustMap Принцип: <потоки> .Merge() .Where(<условие>) .ExhaustMap(<таски> AsObservable()) .Subscribe() Экстеншн: internal static class Ext { internal static IObservable<R> ExhaustMap<T, R>(this IObservable<T> source, Func<T, IObservable<R>> mapper) { return Observable.Defer(() => { var gate = new bool[1]; return source .SelectMany(v => { if (!Volatile.Read(ref gate[0])) { Volatile.Write(ref gate[0], true); return mapper(v) .Do(w => { }, () => Volatile.Write(ref gate[0], false)); } return Observable.Empty<R>(); }); }); } }
Обсуждают сегодня