Всвязи с
этимАвтор: 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? Будет ли проще воспринимать? Могли бы вы привести пример как исправить этот код?