0

Необходимо создать поток, в котором будет функция и очередь разных параметров и он будет по мере добавления в очередь данных параметров запускать функцию. Задержка между добавлениями может быть и минута, поток просто должен висеть и использовать функцию, когда в очередь добавляются параметры.

Пример : У меня есть событие, которое добавляет в список List числовые значения от 1 и до 10. И в зависимости от значения мне необходимо вызывать функцию, например void SetValue(int val). Событие вызывается в случайные моменты времени.

Fresto
  • 1,158
  • 1
    а можно хоть какой-нибудь пример, из которого будет понятно, что вы хотите получить? – Monomax Sep 03 '19 at 12:11
  • 1
    Возможный дубликат: https://ru.stackoverflow.com/q/428327/218063 – Андрей NOP Sep 03 '19 at 12:14
  • А зачем вам отдельный поток? По сути ведь консолька останавливается и ждет ввода при задании ей Console.Read();? – Monomax Sep 03 '19 at 12:14
  • @Monomax добавил простой пример – Fresto Sep 03 '19 at 12:14
  • Не совсем понимаю, в чем основная проблема? Можно перебирать список List<params> в цикле и запускать в зависимости от параметра в цикле SetValue. – Andrei Khotko Sep 03 '19 at 12:17
  • @AndreiKhotko я интересуюсь здесь, чтобы понять, как лучше и правильнее реализовать данный пример. Реализовать кое как я всегда смогу) – Fresto Sep 03 '19 at 12:18
  • @АндрейNOP Возможно, вы правы, буду сейчас изучать это. Спасибо – Fresto Sep 03 '19 at 12:20

1 Answers1

0

Думаю, что вам подойдёт такая вещь как ReactiveExtensions. Есть неплохой сайт для изучения основ.

Ваш пример будет выглядеть на нём примерно так:

    static void Main(string[] args)
    {
        var subject = new Subject<string>();
        var observable = subject.AsObservable(); //Чтобы пользователи не смогли закастить обратно
        Consume(observable);
        subject.OnNext("First");
        Thread.Sleep(1000);
        subject.OnNext("Second");
        Thread.Sleep(5000);
        subject.OnNext("Third");
        subject.OnCompleted();
        Console.ReadKey();
    }

    private static void Consume(IObservable<string> observable)
    {
        observable.Subscribe(
            Console.WriteLine,
            Console.WriteLine,
            () => Console.WriteLine("COmpleted!")); //Никак не обрабатываем IDisposable для простоты
    }

Но чаще всего удобнее бывает использовать фабричные методы Observable, чем напрямую взаимодействовать с Subject.

Kamushek
  • 635
  • А не проще создавать объект Queue, и допустим обрабатывать его каждые n минут, либо сделать привязку на изменение его? – Ivan Sep 03 '19 at 13:06
  • @Ivan, прелесть RX заключается в том, что тебе не нужно заботится о работе с потоками и всем остальным. Ты получаешь удобный API, чтобы писать только бизнес логику. Ну и обработка происходит сразу, а не через n минут :3 – Kamushek Sep 03 '19 at 13:26