Можно ли переписать этот код с использованием RX (пример)?
От: 0K Ниоткуда  
Дата: 30.09.11 11:25
Оценка:
Всвязи с этим
Автор: 0K
Дата: 30.09.11
, пытаюсь разобраться с RX. Прочитал http://www.rsdn.ru/article/dotnet/ReactiveExtensions.xml
Автор(ы): Тепляков Сергей Владимирович
Дата: 06.02.2011
В статье рассматриваются «Реактивные расширения» — библиотека, разработанная компанией Майкрософт для унифицированного доступа к push-based коллекциям, таким как обработка событий, модель асинхронного программирования и т.п.
и просмотрел примеры на http://rxwiki.wikidot.com/101samples, но в течение 2-х часов так и не понял как сделать (конечно, вручную сделать быстрее чем разобраться, но уже бросать психологически тяжело).

В общем, есть код:

using System;
using System.ComponentModel;
using System.Threading;

namespace ConsoleApplication5
{
    internal static class Program
    {
        public class MyEventArgs : EventArgs
        {
            public string Value;
        }

        public class BadPractise
        {
            private BackgroundWorker _backgroundWorker = new BackgroundWorker();

            public EventHandler<MyEventArgs> CompletedEvent;

            public void DoEvilAsync(string value)
            {
                _backgroundWorker.DoWork += backgroundWorker_DoWork;
                _backgroundWorker.RunWorkerCompleted += backgroundWorker_RunWorkerCompleted;

                _backgroundWorker.RunWorkerAsync(value);
            }

            private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
            {
                Thread.Sleep(1000);
                e.Result = e.Argument;
            }

            private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                if (null != CompletedEvent)
                    CompletedEvent(this, new MyEventArgs {Value = (string) e.Result});
            }
        }

        static void Main()
        {
            var badPractise1 = new BadPractise();
            badPractise1.CompletedEvent += complete1;
            badPractise1.DoEvilAsync("1");

            Console.ReadLine();
        }

        private static void complete1(object sender, MyEventArgs args)
        {
            Console.WriteLine(args.Value);

            var badPractise2 = new BadPractise();
            badPractise2.CompletedEvent += complete2;
            badPractise2.DoEvilAsync("result=" + args.Value);
        }

        private static void complete2(object sender, MyEventArgs args)
        {
            Console.WriteLine(args.Value);
        }
    }
}


В нем последовательно вызываются .DoEvilAsync("1") и по завершении (в обработчике события) badPractise2.DoEvilAsync("result=" + args.Value) (второй вызов использует результат первого вызова)

Необходимо, чтобы эти асинхронных 2 метода были вызваны последовательно (то есть второй вызываем только после того, как первый вернул результат).

Можно ли это сделать с помощью RX? Будет ли проще воспринимать? Могли бы вы привести пример как исправить этот код?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.