Re[6]: Good practice по алгоритмизации в условиях асинхронно
От: Undying Россия  
Дата: 23.08.10 06:15
Оценка: 3 (1)
Здравствуйте, sergunok, Вы писали:

S>Код обрабатывает ситуации типа "если минимум проапдейтился, но сейчас есть активная заявка, значит снять ее и по окончании выставить по новой цене"

S>Буду признателен, если подскажите как нечто подобное реализуется с помощью Rx и (или) в псевдосинхронном варианте с помощью yield.

На TaskPulling'е
Автор: Undying
Дата: 27.07.08
будет как-то так:

public static IEnumerable<Step> OrderChecker(Context context, Getter<double> minPriceGetter)
{
   Order order = null;
   double currentMinPrice = minPriceGetter();
   while (context.IsRunning)
   {
      if (order != null)
      {
        // Асинхронное удаление заявки
        bool isDeleted = false;
        context.DeleteOrder(order, delegate() { isDeleted = true; } );
        yield return new WaitStep(delegate { return isDeleted; });
        order = null;
      }

      order = new Order(minPriceGetter());
      context.AddOrder(order);

      yield return new WaitStep(delegate
        {
           if (minPriceGetter() != currentMinPrice)
           {
             currentMinPrice = minPriceGetter();
             // Завершаем ожидание
             return true;
           }
           // Продолжаем ожидание
           return false;
        }); 
   }
}


Требуемую бизнес-логику я не совсем понял, но вроде в такой алгоритм можно встроить все что душе угодно.
Re[7]: Good practice по алгоритмизации в условиях асинхронно
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 23.08.10 07:33
Оценка:
Здравствуйте, Undying, Вы писали:

U>Здравствуйте, sergunok, Вы писали:


S>>Код обрабатывает ситуации типа "если минимум проапдейтился, но сейчас есть активная заявка, значит снять ее и по окончании выставить по новой цене"

S>>Буду признателен, если подскажите как нечто подобное реализуется с помощью Rx и (или) в псевдосинхронном варианте с помощью yield.

U>На TaskPulling'е
Автор: Undying
Дата: 27.07.08
будет как-то так:


U>
U>public static IEnumerable<Step> OrderChecker(Context context, Getter<double> minPriceGetter)
U>{
U>   Order order = null;
U>   double currentMinPrice = minPriceGetter();
U>   while (context.IsRunning)
U>   {
U>      if (order != null)
U>      {
U>        // Асинхронное удаление заявки
U>        bool isDeleted = false;
U>        context.DeleteOrder(order, delegate() { isDeleted = true; } );
U>        yield return new WaitStep(delegate { return isDeleted; });
U>        order = null;
U>      }

U>      order = new Order(minPriceGetter());
U>      context.AddOrder(order);

U>      yield return new WaitStep(delegate
U>        {
U>           if (minPriceGetter() != currentMinPrice)
U>           {
U>             currentMinPrice = minPriceGetter();
U>             // Завершаем ожидание
U>             return true;
U>           }
U>           // Продолжаем ожидание
U>           return false;
U>        }); 
U>   }
U>}
U>

Чето я не понял где здесь асинхронность? Как использовать такой метод?

U>Требуемую бизнес-логику я не совсем понял, но вроде в такой алгоритм можно встроить все что душе угодно.

На самом деле такой алгоритм в линейной форме не выражается. Там два потока входящих событий и один поток исходящих, кореллирующих между собой.
Re[8]: Good practice по алгоритмизации в условиях асинхронно
От: Undying Россия  
Дата: 23.08.10 08:14
Оценка:
Здравствуйте, gandjustas, Вы писали:

U>>Требуемую бизнес-логику я не совсем понял, но вроде в такой алгоритм можно встроить все что душе угодно.

G>На самом деле такой алгоритм в линейной форме не выражается. Там два потока входящих событий и один поток исходящих, кореллирующих между собой.

В чем смысл мыслить в терминах событий? Естественно на событиях такие задачи решаются очень сложно. А просто они решаются в терминах синхронизации того состояния которое есть с тем, которое должно быть.
Re[6]: Good practice по алгоритмизации в условиях асинхронно
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 23.08.10 10:54
Оценка: 3 (1)
Здравствуйте, sergunok, Вы писали:

S>Algorithm реализует стратегию покупки в момент изменения минимума цены.

S>Код обрабатывает ситуации типа "если минимум проапдейтился, но сейчас есть активная заявка, значит снять ее и по окончании выставить по новой цене"

Повторил насколько хватило моих знаний Rx, а их, как выяснилось, крайне мало.
public class Algorithm : IDisposable
{
    // Состояние алгоритма
    private enum StateEn
    {
        // ничего не делаем, ожидаем события
        Idle,
        // покупка
        Buying,
        // снятие заявки на покупку
        CancellingBuy
    }

    private class State
    {
        public State(Order order, StateEn state, double price)
        {
            Order = order;
            StateEn = state;
            Price = price;
        }

        public Order Order { get; private set; }
        public StateEn StateEn { get; private set; }
        public double Price { get; private set; }
    }


    private ITrade trade;

    // Лимит - объем выставляемых заявок.
    private int limit;

    IDisposable cookie;

    public Algorithm(ITrade trade, int limit)
    {
        this.trade = trade;
        this.limit = limit;

        //Последовательность состояний
        IConnectableObservable<State> states = null;
            
        //Создаем ленивость вычислений
        var deferedStates = Observable.Defer(() => states);

        //Используем Subject чтобы сделать из событий IObservable
        var orderChanged = new Subject<Order>();
        var ticks = new Subject<double>();
        this.trade.OrderChanged += o => orderChanged.OnNext(o);
        this.trade.NewTick += v => ticks.OnNext(v);

        //Последовательность минимальных цен
        var minPrices = ticks.Scan(double.MaxValue, (min, v) => min > v ? v : min).DistinctUntilChanged();

        //Разделяем потоки событий чтобы легче было писать
        var orderMatched = orderChanged.Where(o => o.Status == OrderStatusEn.Matched);
        var orderCancelled = orderChanged.Where(o => o.Status == OrderStatusEn.Cancelled);
        var idleState = deferedStates.Where(s => s.StateEn == StateEn.Idle);
        var buyState = deferedStates.Where(s => s.StateEn == StateEn.Buying);
        var cancellingState = deferedStates.Where(s => s.StateEn == StateEn.CancellingBuy);

        //Объединяем несколько результирующих потоков в один
        states = 
            Observable.Join(
                //Если новая минимальная цена и ожидаем события, то покупаем
                minPrices.And(idleState).Then((p, _) => Buy(p)),
                //Если новая минимальная цена и покупаем, то отменям
                minPrices.And(buyState)
                            .Then((p, s) =>
                            {
                                this.trade.CancelOrder(s.Order);
                                return new State(null, StateEn.CancellingBuy, p);
                            }),
                //Если статус заявки изменился на matched  и покупаем, то переходим в ожидание
                orderMatched.And(buyState).Then((o, s) => new State(null, StateEn.Idle, s.Price)),
                //Если статус заявки изменился и отменяем, то покупаем по новой цене 
                orderChanged.And(cancellingState).Then((_, s) => Buy(s.Price))
            ).Publish(new State(null, StateEn.Idle, 0));//Создается асинхронность
            

        cookie = states.Subscribe(s =>
            {
                //Получили забесплатно логирование в одном месте
#if DEBUG
                Console.WriteLine("{0} {1} {2}", DateTime.Now, s.StateEn, s.Price);
#endif
            });
        states.Connect();
    }


    private State Buy(double price)
    {
        var order = new Order() { Price = price, Volume = this.limit };
        this.trade.RegisterOrder(order);
        return new State(order, StateEn.Buying, price);
    }

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

В местах, выделенных жирным можно подсовывать начальные значения в случае перезапуска.

По сути ничем не лучше вариантов с обработчиками событий, кроме того что вся логика записана в одном месте.
Re[9]: Good practice по алгоритмизации в условиях асинхронно
От: sergunok  
Дата: 23.08.10 12:34
Оценка:
Undying и gandjustas, спасибо за примеры кода!
Перевариваю их сейчас..

По поводу:
U>В чем смысл мыслить в терминах событий? Естественно на событиях такие задачи решаются очень сложно. А просто они решаются в терминах синхронизации того состояния которое есть с тем, которое должно быть.

Очередь выходных событий (не очень нравится в данном случае термин "очередь выходных событий", скорее назвал бы очередью действий) ИМХО — это хороший способ решать широкий круг подобных задач. (Хотя для моего примера — это возможно "из пушки по воробьям").

Думаю, что при использовании очереди здорово разрешать действиям из очереди подписываться на входные события.

Для моего примера действиями могут быть:
WaitingAction
BuyAction
CancelingBuyAction

У каждого Action есть свой метод Do.

Подписывание на события:
WaitingAсtion подписывается на событие новый min
BuyAction на удовлетворение заявки и новый min
CancelingBuyAction на удовлетворение заявки или снятие

(В данном примере действия по сути совпали с состояниями)

Обработчикам доступны любые методы по модификации очереди действий и функция старта обработки след."действия" из очереди.
Re[10]: Good practice по алгоритмизации в условиях асинхронн
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 23.08.10 14:07
Оценка: 3 (1)
Здравствуйте, sergunok, Вы писали:

S>Undying и gandjustas, спасибо за примеры кода!

S>Перевариваю их сейчас..

Немного подумав удалось свести к такому варианту:

class TradeAdapter
{
    ITrade trade;
    public TradeAdapter(ITrade trade)
    {
        this.trade = trade;

        var s = new Subject<double>();
        this.trade.NewTick += s.OnNext;
        Ticks = s;
    }

    public IObservable<OrderStatusEn> Buy(double price, int volume)
    {
        return Observable.CreateWithDisposable<OrderStatusEn>(obs =>
            {
                var order = new Order() { Price = price, Volume = volume };
                this.trade.RegisterOrder(order);

                var cancel = new CancellationDisposable();
                var isProcessed = false;

                Action<Order> changed = null;
                changed = o =>
                {
                    if (o == order)
                    {
                        isProcessed = true;
                        obs.OnNext(o.Status);
                        obs.OnCompleted();
                        this.trade.OrderChanged -= changed;
                    }
                };
                this.trade.OrderChanged += changed;

                cancel.Token.Register(() =>
                {
                    if (!isProcessed) trade.CancelOrder(order);
                });

                return cancel;
            });
    }

    public IObservable<double> Ticks { get; private set; }
}

public class Algorithm : IDisposable
{
    IDisposable cookie;

    public Algorithm(ITrade trade, int limit)
    {
        var adapter = new TradeAdapter(trade);
        var minPrices = adapter.Ticks.Scan(Math.Min).DistinctUntilChanged().Publish();
        var buyOnMinPrice = minPrices.SelectMany(p => adapter.Buy(p, limit).TakeUntil(minPrices));
        cookie = buyOnMinPrice.Subscribe();
        minPrices.Connect();
    }

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


Правда работает не совсем так как хочется. Немного кривоват ITrade получается для таких задач.

Надо больше пользоваться стандартными .NETовскми паттернами для асинхронных операций и эвентов.
Re[3]: Good practice по алгоритмизации в условиях асинхронно
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 23.08.10 14:20
Оценка: 2 (1)
Здравствуйте, sergunok, Вы писали:

S>Здравствуйте, Ikemefula, Вы писали:


I>>А какие с этим проблемы если ты автомат уже выделил ?


S>Проблемы буду скоро когда, буду трансформировать более сложный алгоритм в автомат.


S>Согласен с gandjustas, что для перевода синхронного алгоритма а автоматный вид требуются усилия (пускай и автоматизируемые).


S>Пока только не совсем понимаю как все это решается RX'ом или вот даже просто yield, последнее в Питоновском Twisted Framework

S>решал сам фреймворк:

S>@inlineCallback

S>def login(self, login, pwd):
S> success = yield loginRemotely(login, pwd)
S> self.data = yield loadData(login)


IObservable<Data> Login(string login, string pwd)
{
    return from _ in LoginRemotely(login, pwd) //LoginRemotely возвращает IObservable<ЧТОНИТЬ>
           from d in LoadData(login) //LoadData возвращает IObservable<Data>
           select d;
}
Re[10]: Good practice по алгоритмизации в условиях асинхронн
От: Undying Россия  
Дата: 24.08.10 03:54
Оценка:
Здравствуйте, sergunok, Вы писали:

S>Очередь выходных событий (не очень нравится в данном случае термин "очередь выходных событий", скорее назвал бы очередью действий) ИМХО — это хороший способ решать широкий круг подобных задач. (Хотя для моего примера — это возможно "из пушки по воробьям").


Я не совсем понимаю, зачем в таких задачах вообще строить логику на событиях. Как я понимаю задача у тебя примерно такая. Есть некий биржевой товар, у которого время от времени изменяется цена. При изменениях цены и выполнение определенных условий надо либо удалить старую заявку, либо поставить новую заявку, либо вначале удалить старую, а затем поставить новую заявку. Соответственно на каждый биржевой товар заводим Task, пока цена не меняется Task спит, как только поменялась, Task просыпает и проверяет условия — нужно ли удалять существующую заявку (если она есть) и нужно ли ставить новую заявку. Проблема может быть в том, что добавление и удаление заявок являются асинхронным операциями, но эту проблему TaskPulling позволяет легко решить.

Достоинства. Все изменения производятся из одного места и в предсказуемом порядке (к примеру, вначале производится удаление старой заявки, затем добавление новой), поэтому легко гарантировать, что в конкретный момент времени может существовать только одна заявка, не нужно думать о том, что произойдет если вначале придет событие на удаление, тут же событие на добавление и тут же снова на удаление и т.п. Соответственно код получается простым и надежным.
Re[11]: Good practice по алгоритмизации в условиях асинхронн
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 24.08.10 05:43
Оценка:
Здравствуйте, Undying, Вы писали:

U>Здравствуйте, sergunok, Вы писали:


S>>Очередь выходных событий (не очень нравится в данном случае термин "очередь выходных событий", скорее назвал бы очередью действий) ИМХО — это хороший способ решать широкий круг подобных задач. (Хотя для моего примера — это возможно "из пушки по воробьям").


U>Я не совсем понимаю, зачем в таких задачах вообще строить логику на событиях. Как я понимаю задача у тебя примерно такая. Есть некий биржевой товар, у которого время от времени изменяется цена. При изменениях цены и выполнение определенных условий надо либо удалить старую заявку, либо поставить новую заявку, либо вначале удалить старую, а затем поставить новую заявку. Соответственно на каждый биржевой товар заводим Task, пока цена не меняется Task спит, как только поменялась, Task просыпает и проверяет условия — нужно ли удалять существующую заявку (если она есть) и нужно ли ставить новую заявку. Проблема может быть в том, что добавление и удаление заявок являются асинхронным операциями, но эту проблему TaskPulling позволяет легко решить.


Честно говоря не понимаю терминов, которые ты используешь. Можешь пример рабочего кода привести и рассказать что такое Task и TaskPulling.
Если Task это System.Threading.Tasks.Task, то то что ты описываешь ничуть не лучше Rx и потоков событий (асинхронных коллекций), а даже хуже, так как потребует большого количества водопроводного кода.
Re[12]: Good practice по алгоритмизации в условиях асинхронн
От: Undying Россия  
Дата: 24.08.10 05:58
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Честно говоря не понимаю терминов, которые ты используешь.


Что именно непонятно? Сам принцип замены логики на событиях на логику синхронизации текущего состояния с требуемым? Или принцип понятен, но непонятно как реализуется синхронизация состояний при наличии асинхронных операций на TaskPulling'е?

G>Можешь пример рабочего кода привести и рассказать что такое Task и TaskPulling.


Описание здесь: http://rsdn.ru/forum/dotnet/3037674.1.aspx
Автор: Undying
Дата: 27.07.08


G>Если Task это System.Threading.Tasks.Task, то то что ты описываешь ничуть не лучше Rx и потоков событий (асинхронных коллекций), а даже хуже, так как потребует большого количества водопроводного кода.


Имеется в виду Task из TaskPulling'а.
Re[13]: Good practice по алгоритмизации в условиях асинхронн
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 24.08.10 06:13
Оценка:
Здравствуйте, Undying, Вы писали:

U>Здравствуйте, gandjustas, Вы писали:


G>>Честно говоря не понимаю терминов, которые ты используешь.


U>Что именно непонятно? Сам принцип замены логики на событиях на логику синхронизации текущего состояния с требуемым? Или принцип понятен, но непонятно как реализуется синхронизация состояний при наличии асинхронных операций на TaskPulling'е?

Непонятно как реализуется асинхронность в данном случае. Выполнение кода должно как-то прерываться и потом возвращаться назад.

G>>Можешь пример рабочего кода привести и рассказать что такое Task и TaskPulling.

U>Описание здесь: http://rsdn.ru/forum/dotnet/3037674.1.aspx
Автор: Undying
Дата: 27.07.08

Ну если все опирается на таймер, то так делать не стоит.

G>>Если Task это System.Threading.Tasks.Task, то то что ты описываешь ничуть не лучше Rx и потоков событий (асинхронных коллекций), а даже хуже, так как потребует большого количества водопроводного кода.

U>Имеется в виду Task из TaskPulling'а.
Тогда уж лучше взять таски из TPL и ParallelExtensionExtras
Re[14]: Good practice по алгоритмизации в условиях асинхронн
От: Undying Россия  
Дата: 24.08.10 06:40
Оценка:
Здравствуйте, gandjustas, Вы писали:

U>>Что именно непонятно? Сам принцип замены логики на событиях на логику синхронизации текущего состояния с требуемым? Или принцип понятен, но непонятно как реализуется синхронизация состояний при наличии асинхронных операций на TaskPulling'е?

G>Непонятно как реализуется асинхронность в данном случае. Выполнение кода должно как-то прерываться и потом возвращаться назад.

Для этого и существуют yield'ы. Например, у нас изменилась цена товара, из-за чего старую заявку нужно удалить, удаление заявки операция асинхронная. Соответственно таска, заметив изменение цены, активируется и начинает удаление заявки, пока заявка не удалена таска ждет (с помощью yield return new WaitStep()). Пока заявка не будет удалена новые изменения цены будут либо игнорироваться, либо складываться в очередь, в зависимости от того, что требуется по условию задачи. Как только заявка удалилась таска продолжает свою работу.

G>>>Можешь пример рабочего кода привести и рассказать что такое Task и TaskPulling.

U>>Описание здесь: http://rsdn.ru/forum/dotnet/3037674.1.aspx
Автор: Undying
Дата: 27.07.08

G>Ну если все опирается на таймер, то так делать не стоит.

Таймер это решение для бедных, если псевдосинхронная запись решение задачи облегачает, а использовать TaskPulling по каким-то причинам не хочется. Собственно TaskPulling никакие таймеры не использует.
Re[15]: Good practice по алгоритмизации в условиях асинхронн
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 24.08.10 07:58
Оценка:
Здравствуйте, Undying, Вы писали:

U>Здравствуйте, gandjustas, Вы писали:


U>>>Что именно непонятно? Сам принцип замены логики на событиях на логику синхронизации текущего состояния с требуемым? Или принцип понятен, но непонятно как реализуется синхронизация состояний при наличии асинхронных операций на TaskPulling'е?

G>>Непонятно как реализуется асинхронность в данном случае. Выполнение кода должно как-то прерываться и потом возвращаться назад.

U>Для этого и существуют yield'ы. Например, у нас изменилась цена товара, из-за чего старую заявку нужно удалить, удаление заявки операция асинхронная. Соответственно таска, заметив изменение цены, активируется и начинает удаление заявки, пока заявка не удалена таска ждет (с помощью yield return new WaitStep()). Пока заявка не будет удалена новые изменения цены будут либо игнорироваться, либо складываться в очередь, в зависимости от того, что требуется по условию задачи. Как только заявка удалилась таска продолжает свою работу.

Это я в курсе. Меня другое интересует. Вот есть асинхронный вызов, типа BeginRead, на нем я хочу прервать выполнение с помощью yield и вернутся когда вызов завершится. Значит мне надо что-то передать в callback этого самого BeginRead, что вызовет продолжение работы с места прерывания.

G>>>>Можешь пример рабочего кода привести и рассказать что такое Task и TaskPulling.

U>>>Описание здесь: http://rsdn.ru/forum/dotnet/3037674.1.aspx
Автор: Undying
Дата: 27.07.08

G>>Ну если все опирается на таймер, то так делать не стоит.

U>Таймер это решение для бедных, если псевдосинхронная запись решение задачи облегачает, а использовать TaskPulling по каким-то причинам не хочется. Собственно TaskPulling никакие таймеры не использует.

А что использует?

Кстати с помощью Rx итераторы делаются очень легко.
Пример (чтение заданного количества байт из потока):
public static IObservable<Unit> ReadExact(this Stream stream, byte[] buffer, int offset, int count)
{
    return ReadExactInternal(stream, buffer, offset, count).Concat().TakeLast(1).Select(_ => new Unit());
}
public static IEnumerable<IObservable<int>> ReadExactInternal(Stream stream, byte[] buffer, int offset, int count)
{
    var read = Observable.FromAsyncPattern<byte[], int, int, int>(stream.BeginRead, stream.EndRead);
    while(count>0)
    {
        int bytesRead = 0;
        yield return read(buffer, offset, count).Do(r => bytesRead = r);
        count -= bytesRead;
        offset += bytesRead;
    }
}
Re[13]: Good practice по алгоритмизации в условиях асинхронн
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 24.08.10 08:13
Оценка:
Здравствуйте, Undying, Вы писали:

U>Описание здесь: http://rsdn.ru/forum/dotnet/3037674.1.aspx
Автор: Undying
Дата: 27.07.08


Посмотрел код, там потоки запускаются, не пойдет.

Примерно в тоже время в MSDN Magazine появилась статья про AsyncEnumerator, который без дополнительных потоков работает.
http://msdn.microsoft.com/ru-ru/magazine/cc546608.aspx
http://msdn.microsoft.com/ru-ru/magazine/cc721613.aspx

А также в июне 2008 была уже доступна библиотека Parallel Extensions с тасками.
Re[16]: Good practice по алгоритмизации в условиях асинхронн
От: Undying Россия  
Дата: 24.08.10 08:22
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Это я в курсе. Меня другое интересует. Вот есть асинхронный вызов, типа BeginRead, на нем я хочу прервать выполнение с помощью yield и вернутся когда вызов завершится. Значит мне надо что-то передать в callback этого самого BeginRead, что вызовет продолжение работы с места прерывания.


В чем проблема-то? Примерный код я здесь приводил: http://rsdn.ru/forum/design/3929522.1.aspx
Автор: Undying
Дата: 23.08.10


U>>Таймер это решение для бедных, если псевдосинхронная запись решение задачи облегачает, а использовать TaskPulling по каким-то причинам не хочется. Собственно TaskPulling никакие таймеры не использует.

G>А что использует?

TaskPulling ставит таску в очередь указанного потока. Далее поток просыпается берет первую таску из очереди, делает очередной шаг таски, после чего таска сдвигается в конец очереди (реально посложнее немного, но не суть).
Re[14]: Good practice по алгоритмизации в условиях асинхронн
От: Undying Россия  
Дата: 24.08.10 08:32
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Посмотрел код, там потоки запускаются, не пойдет.

G>Примерно в тоже время в MSDN Magazine появилась статья про AsyncEnumerator, который без дополнительных потоков работает.

Написать вариант TaskPulling'а базирующийся на WinForms.Timer и соответственно работающий в том же потоке дело 15 минут, только на большинстве задач смысла в этом никакого, исключение, наверное, некоторые задачи связанные с гуи.
Re[15]: Good practice по алгоритмизации в условиях асинхронн
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 24.08.10 08:41
Оценка:
Здравствуйте, Undying, Вы писали:

U>Здравствуйте, gandjustas, Вы писали:


G>>Посмотрел код, там потоки запускаются, не пойдет.

G>>Примерно в тоже время в MSDN Magazine появилась статья про AsyncEnumerator, который без дополнительных потоков работает.

U>Написать вариант TaskPulling'а базирующийся на WinForms.Timer и соответственно работающий в том же потоке дело 15 минут, только на большинстве задач смысла в этом никакого, исключение, наверное, некоторые задачи связанные с гуи.


Таймер слишком редко срабатывает для таких задач, а плодить потоки — быстро придет белый пушной зверек под нагрузкой.
Нужно полностью асинхронный механизм работы (на коллбеках), в TPL и Rx такой есть, зачем что-то еще использовать?
Re[16]: Good practice по алгоритмизации в условиях асинхронн
От: Undying Россия  
Дата: 24.08.10 08:48
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Таймер слишком редко срабатывает для таких задач, а плодить потоки — быстро придет белый пушной зверек под нагрузкой.


Зачем плодить потоки? Кто мешает ставить произвольное количество тасок в один и тот же поток?
Re[16]: Good practice по алгоритмизации в условиях асинхронн
От: Undying Россия  
Дата: 24.08.10 08:56
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Нужно полностью асинхронный механизм работы (на коллбеках), в TPL и Rx такой есть, зачем что-то еще использовать?


Если на них можно решать задачи только в таком стиле: http://rsdn.ru/forum/design/3929847.1.aspx
Автор: gandjustas
Дата: 23.08.10
, то ничего общего с TaskPulling'ом они не имеют. Принципы решения задач совершенно разные.
Re[17]: Good practice по алгоритмизации в условиях асинхронн
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 24.08.10 09:05
Оценка:
Здравствуйте, Undying, Вы писали:

U>Здравствуйте, gandjustas, Вы писали:


G>>Таймер слишком редко срабатывает для таких задач, а плодить потоки — быстро придет белый пушной зверек под нагрузкой.


U>Зачем плодить потоки? Кто мешает ставить произвольное количество тасок в один и тот же поток?


Да никто не мешает, только поток висит в ожидании после выполнения шага. При большом количестве задач в очереди такая схема начинает сосать со страшной силой, поэтому надо плодить потоки.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.