[ANN] Reactive Extensions for .NET (Rx)
От: Пельмешко Россия blog
Дата: 17.11.09 21:00
Оценка: 283 (17)
Сабж зарелизили:

http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx

Ссылки на скачку:
<b>[Для .NET 3.5 SP1]</b>
<b>[Для .NET 4 beta2]</b>
<b>[Для Silverliqht 3]</b>

А так же: <b>Reactive Extensions Team Blog</b>

Ура, товарищи, Erik Meijer strikes again!

Много вкуснятины:

The installer ships the following dlls:

System.CoreEx, api used by both System.Reactive and System.Interactive:

* Additional Action<,> and Func<,> types (for .NET 3.5 SP1 only, matches types in .NET 4)
* TimeInterval<T> & TimeStamped<T> adds time information to a value.
* IEvent<TEventArgs> wraps existing .NET event values.
* Notification<T> to materialize next/error/completed notifications.
* SynchronizationContexts provides access to common SynchronizationContexts.
* Unit, represents void for use in generics.
* BooleanSignal, a boolean state locking mechanism wrapping Semaphore.
* Semaphore adds the semaphore functionality to Silverlight 3.

System.Reactive, api related to IObservable & IObserver.

* IObservable<T> & IObserver<T>, the base interfaces for Reactive (lives in mscorlib.dll for .NET 4).
* Numerous Observable & Observer sequence operators:

o Standard LINQ operaturs such as: Select, Where, GroupBy, SelectMany
o combining operations such as Zip Repeat, Merge, Amb, Concat and StartWith.
o caching operations such as: Share, Memoize, MemoizeAll and Publish.
o creation operators such as: Return, Throw, Repeat and Generate.
o threading operators such as: Asynchronous, Synchronize, SubscribeOn, ObserveOn.
o exception handling operators such as: Catch, Finally, Retry and OnErrorResumeNext.
o evaluation operators such as: Run & Do.
o stream manipulation operators such as: Scan and Aggregate
o time based operators: Timestamp, Interval, Delay,
o remoting operator: Remotable

* Various Subjects, publish & subscribe (pub/sub) for Reactive with different caching policies.
* System.Joins.*, implements join-calculus on top of Rx.

System.Interactive, backport of Observable sequence operators that apply to IEnumerable as well.

* combining operations such as Zip (for .NET 3.5 SP1 and Silverlight 3), Repeat, Merge, Amb, Concat and StartWith.
* caching operations such as: Share, Memoize, MemoizeAll and Publish.
* creation operators such as: Return, Throw, Repeat and Generate.
* threading operators such as: Asynchronous & Synchronize.
* exception handling operators such as: Catch, Finally, Retry and OnErrorResumeNext.
* evaluation operators such as: Run & Do.
* stream manipulation operators such as: Scan.
* remoting operator: Remotable.

Re: [ANN] Reactive Extensions for .NET (Rx)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 17.11.09 21:48
Оценка: 7 (1)
Здравствуйте, Пельмешко, Вы писали:

П>Сабж зарелизили:


До кучи

http://channel9.msdn.com/posts/Charles/Erik-Meijer-Rx-in-15-Minutes/
Re: [ANN] Reactive Extensions for .NET (Rx)
От: Аноним  
Дата: 18.11.09 03:12
Оценка:
Здравствуйте, Пельмешко, Вы писали:

Висит груша, нельзя скушать
Re: [ANN] Reactive Extensions for .NET (Rx)
От: z00n  
Дата: 18.11.09 03:36
Оценка:
Здравствуйте, Пельмешко, Вы писали:

П>Сабж зарелизили:


Amb!
Re[2]: [ANN] Reactive Extensions for .NET (Rx)
От: agos Россия http://trtrmitya.wordpress.com
Дата: 18.11.09 05:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Висит груша, нельзя скушать

прочитал соглашение, стало грустно
Не переходите улицу на тот свет..
Re[3]: [ANN] Reactive Extensions for .NET (Rx)
От: cadet354 Россия
Дата: 19.11.09 07:03
Оценка:
Здравствуйте, agos, Вы писали:

А>>Висит груша, нельзя скушать

A>прочитал соглашение, стало грустно
ну так сырой он еще,(хотя идея хороша), вот поэтому и дают использовать, ИМНО именно этим и объясняется.
свежий баг
... << RSDN@Home 1.2.0 alpha 4 rev. 1270>>
Re[4]: [ANN] Reactive Extensions for .NET (Rx)
От: Пельмешко Россия blog
Дата: 19.11.09 12:58
Оценка: 2 (1)
Здравствуйте, cadet354, Вы писали:

C>ну так сырой он еще,(хотя идея хороша), вот поэтому и дают использовать, ИМНО именно этим и объясняется.


Мне лично непонятно почему System.Unit — это valuetype
Это специально чтоль чтобы generic-код компилировался специализированный для Unit?
Почему не ref-тип с адресным null в качестве значения?

И почему не унифицировали Unit в mscorlib четвёртого .NET, в F# свой class Microsoft.FSharp.Core.unit, тут свой...

p.s. порадовал .Memoize(), давно пора было включить... .Remotable(), .Share(), .Do(), .Run() тоже рулят

p.p.s. Может кто подкинет ссылки что за зверь такой — этот join calculus, что-то ничего не смог нагуглить внятного, примеры бы.
Re: [ANN] Reactive Extensions for .NET (Rx)
От: Аноним  
Дата: 19.11.09 13:11
Оценка:
Здравствуйте, Пельмешко, Вы писали:

П>Сабж зарелизили:


никак не найду примеры использования
неужто по chm'ам "учится"?
Re[2]: [ANN] Reactive Extensions for .NET (Rx)
От: Vladek Россия Github
Дата: 19.11.09 13:58
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, Пельмешко, Вы писали:


П>>Сабж зарелизили:


А>никак не найду примеры использования

А>неужто по chm'ам "учится"?

Пока есть только скринкасты, на Rx 101 Samples времени не хватило, но обещают. Вот ещё серию статей рекомендуют.
Everything is an object
Re[5]: [ANN] Reactive Extensions for .NET (Rx)
От: achmed Удмуртия https://www.linkedin.com/in/nail-achmedzhanov-9907188/
Дата: 20.11.09 10:49
Оценка:
Здравствуйте, Пельмешко, Вы писали:


П>p.p.s. Может кто подкинет ссылки что за зверь такой — этот join calculus, что-то ничего не смог нагуглить внятного, примеры бы.


Вроде бы это просто объединение данных полученных из набора событий,
например, вызвать два веб-сервиса(IObservable) и получить оба ответа.
Re: [ANN] Reactive Extensions for .NET (Rx)
От: Пельмешко Россия blog
Дата: 20.11.09 12:32
Оценка:
А может кто подсказать как на стандартных операторах из System.Linq.Observable сделать такое observable, чтобы возвращало числа в определённым промежутке с определённым временным интервалом?

Не могу очистить разум от IEnumerable, написал такое:
static void Main()
{
  var ob = Observable
    .Range(0, 20)
    .SelectMany(x => Observable.Return(x).Delay(x * 500));

  ob.Subscribe(
    x  => Console.WriteLine("OnNext:  {0}", x),
    e  => Console.WriteLine("OnError: {0}", e),
    () => Console.WriteLine("OnCompleted")
    );

  Thread.Sleep(-1);
}

Но не нравиться мне это... да и только для промежутков 0 .. x корректно...
Можно как-нибудь переиначить?
Re[6]: [ANN] Reactive Extensions for .NET (Rx)
От: Пельмешко Россия blog
Дата: 20.11.09 13:00
Оценка:
Здравствуйте, achmed, Вы писали:

A>Здравствуйте, Пельмешко, Вы писали:


П>>p.p.s. Может кто подкинет ссылки что за зверь такой — этот join calculus, что-то ничего не смог нагуглить внятного, примеры бы.


A>Вроде бы это просто объединение данных полученных из набора событий,

A>например, вызвать два веб-сервиса(IObservable) и получить оба ответа.

Да с этим и Observable.Zip() справится на ура...
static void Main()
{
  var service1 =
    Observable.Return("Service1 answer #1").Delay(1000).Merge(
    Observable.Return("Service1 answer #2").Delay(4000));

  var service2 =
    Observable.Return("Service2 answer #1").Delay(500).Merge(
    Observable.Return("Service2 answer #2").Delay(1500).Merge(
    Observable.Return("Service2 answer #3").Delay(2000)));

  var ob = service1.Zip(service2, (s1, s2) => new { s1, s2 });

  ob.Subscribe(
    x  => Console.WriteLine("OnNext:  {0}",  x),
    ex => Console.WriteLine("OnError: {0}", ex),
    () => Console.WriteLine("OnCompleted")
    );

  Thread.Sleep(-1);
}


OnNext: { s1 = Service1 answer #1, s2 = Service2 answer #1 }
OnNext: { s1 = Service1 answer #2, s2 = Service2 answer #2 }
OnCompleted


Методы Observable.Join() и классы из System.Joins вообще мутные какие-то...
Re[7]: [ANN] Reactive Extensions for .NET (Rx)
От: cadet354 Россия
Дата: 20.11.09 15:12
Оценка:
Здравствуйте, Пельмешко, Вы писали:

П>Методы Observable.Join() и классы из System.Joins вообще мутные какие-то...

странно, ты не читал тут недавно ссылка была на PATTERNS OF PARALLEL PROGRAMMING?, выдержка оттуда:

FORK/JOIN
The patterns employed for delightfully parallel loops are really a subset of a larger set of patterns centered around “fork/join.” In fork/join patterns, work is “forked” such that several pieces of work are launched asynchronously. That forked work is later joined with in order to ensure that all of the processing has completed, and potentially to retrieve the results of that processing if it wasn’t utilized entirely for side-effecting behavior.

а zip это скорее для агрегации данных, можно в ухе и отверткой ковыряться, только не очень глубоко
... << RSDN@Home 1.2.0 alpha 4 rev. 1270>>
Re[8]: [ANN] Reactive Extensions for .NET (Rx)
От: Пельмешко Россия blog
Дата: 20.11.09 15:56
Оценка:
Здравствуйте, cadet354, Вы писали:

C>Здравствуйте, Пельмешко, Вы писали:


П>>Методы Observable.Join() и классы из System.Joins вообще мутные какие-то...

C>странно, ты не читал тут недавно ссылка была на PATTERNS OF PARALLEL PROGRAMMING?, выдержка оттуда:

Не читал ещё, а должен был? Странно?
Под "мутностью" я имел ввиду слабое понимание предназначения классов типа System.Joins.Pattern и System.Joins.Plan без открытых конструкторов и статических членов... Сейчас разобрался, обнаружив Observable.And() и .Then()

C>а zip это скорее для агрегации данных


Никакой разницы в поведении. Можно и .ForkJoin()'ом, только оно дождётся лишь по одному сообщению от обоих observer'ов...
Re[2]: [ANN] Reactive Extensions for .NET (Rx)
От: Аlexey  
Дата: 20.11.09 17:28
Оценка: 16 (2)
Здравствуйте, Пельмешко, Вы писали:

П>Можно как-нибудь переиначить?


Вот так можно
var ob = Observable
    .Range(10, 10)
    .Zip(
        Observable.Return(new Unit()).Delay(1000).Repeat(),
        (value, tick) => value);

Работает если и не с 0 начинается счет.
Re[3]: [ANN] Reactive Extensions for .NET (Rx)
От: Аlexey  
Дата: 20.11.09 17:40
Оценка:
Здравствуйте, Аlexey, Вы писали:

П>>Можно как-нибудь переиначить?


А>Вот так можно

А>
А>var ob = Observable
А>    .Range(10, 10)
А>    .Zip(
А>        Observable.Return(new Unit()).Delay(1000).Repeat(),
А>        (value, tick) => value);
А>

А>Работает если и не с 0 начинается счет.

А еще вот так
var ob = Observable.Generate(
    10,
    x => x < 20,
    x => x,
    x => TimeSpan.FromSeconds(1),
    x => x + 1
    );
Re[9]: [ANN] Reactive Extensions for .NET (Rx)
От: Аlexey  
Дата: 20.11.09 17:56
Оценка:
Здравствуйте, Пельмешко, Вы писали:

C>>а zip это скорее для агрегации данных


П>Никакой разницы в поведении. Можно и .ForkJoin()'ом, только оно дождётся лишь по одному сообщению от обоих observer'ов...


Глянул реализацию ForkJoin, оказалось что именно так оно и работает
   return leftSource.Zip<TLeftSource, TRightSource, TResult>(rightSource, selector).Take<TResult>(1);
Re[10]: [ANN] Reactive Extensions for .NET (Rx)
От: Пельмешко Россия blog
Дата: 20.11.09 18:21
Оценка:
Здравствуйте, Аlexey, Вы писали:

А>Здравствуйте, Пельмешко, Вы писали:


C>>>а zip это скорее для агрегации данных


П>>Никакой разницы в поведении. Можно и .ForkJoin()'ом, только оно дождётся лишь по одному сообщению от обоих observer'ов...


А>Глянул реализацию ForkJoin, оказалось что именно так оно и работает

А>
А>   return leftSource.Zip<TLeftSource, TRightSource, TResult>(rightSource, selector).Take<TResult>(1);
А>


Интересно

Хорошо, что в C# 4.0 сделали вывод типов из method group, можно будет не писать лямбды селекторов если надо просто вернуть кортеж объединённых значений, а сразу передать перегрузки Tuple.Create:
Observable.Join(observable1.And(observable2).And(observable3).Then(Tuple.Create))

Очень неплохо выглядит
Re[3]: [ANN] Reactive Extensions for .NET (Rx)
От: Пельмешко Россия blog
Дата: 21.11.09 15:16
Оценка:
Здравствуйте, Аlexey, Вы писали:

А>Здравствуйте, Пельмешко, Вы писали:


П>>Можно как-нибудь переиначить?


А>Вот так можно

А>
А>var ob = Observable
А>    .Range(10, 10)
А>    .Zip(
А>        Observable.Return(new Unit()).Delay(1000).Repeat(),
А>        (value, tick) => value);
А>

А>Работает если и не с 0 начинается счет.

Проглядел Observable.Interval(), с ним ещё короче:
var ob = Observable.Range(0, 10).Zip(Observable.Interval(100), (i, _) => i);
Re[9]: [ANN] Reactive Extensions for .NET (Rx)
От: cadet354 Россия
Дата: 23.11.09 08:24
Оценка:
Здравствуйте, Пельмешко, Вы писали:


П>Не читал ещё, а должен был? Странно?

нет конечно, должен это когда взял и не вернул, это был не упрек, а мое удивление.

C>>а zip это скорее для агрегации данных


П>Никакой разницы в поведении. Можно и .ForkJoin()'ом, только оно дождётся лишь по одному сообщению от обоих observer'ов...

и точно, я еще на библиотеку как следует не смотрел, как думаешь из F# будет удобно использовать? (например LINQ ИМНО ни разу не удобно)
... << RSDN@Home 1.2.0 alpha 4 rev. 1270>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.