[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>>
Re[10]: [ANN] Reactive Extensions for .NET (Rx)
От: Пельмешко Россия blog
Дата: 23.11.09 09:50
Оценка:
Здравствуйте, cadet354, Вы писали:

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


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

C>и точно, я еще на библиотеку как следует не смотрел, как думаешь из F# будет удобно использовать? (например LINQ ИМНО ни разу не удобно)

Конкретно этот Rx, на базе перегруженных extension-методов в F# можно использовать только на манер linq method syntax в C#:

open System.Linq

let query = (seq { 1 .. 10 }).Where(fun x -> x % 2 = 0).Select((*) 2)

Но это косячно, например, нельзя перенести .MethodName() на новую строку + иногда partial application не дружит с приведением к типу делегата...
Да и вообще с перегрузкой выводу типов сложнее, а ещё чаще вообще невозможно вывести правильный тип...

Другое дело — модуль Observable и поддержка со стороны компилятора
В последнем релизе любой event — уже IObservable, никаких Observable.FromEvent() не надо.

Вот только похоже разрабатывают F# Observable далеко не те же люди, что и Rx... Функционал модуля Observable пока достаточно скромен и не понятно, будет ли когда-нибудь этот функционал базироваться на "официальном" Rx.

p.s. Лично мне не понятно зачем после появления Observable в F# оставили модуль Event и IEvent... Похоже F# first-class events так и останутся жить своей жизнью, с последнего релиза вроде как в FSharp.Core не будут вносить breaking changes...
Re[10]: [ANN] Reactive Extensions for .NET (Rx)
От: Пельмешко Россия blog
Дата: 23.11.09 12:50
Оценка:
Здравствуйте, cadet354, Вы писали:

C>как думаешь из F# будет удобно использовать?


Вот, кстати, товарищи уже обёртки пишут:
http://www.navision-blog.de/2009/11/23/mapping-the-reactive-framework-rx-operators-for-f/

Только что-то не нравится мне перспектива оборачивания функциональных типов в делегаты...
Re[11]: [ANN] Reactive Extensions for .NET (Rx)
От: cadet354 Россия
Дата: 23.11.09 14:26
Оценка:
Здравствуйте, Пельмешко, Вы писали:


П>Только что-то не нравится мне перспектива оборачивания функциональных типов в делегаты...

чем не нравиться,только из-за чистоты, уж не думаю, что там производительность просядет, или что немцу хорошо то русскому смерть?
... << RSDN@Home 1.2.0 alpha 4 rev. 1270>>
Re[12]: [ANN] Reactive Extensions for .NET (Rx)
От: Пельмешко Россия blog
Дата: 23.11.09 14:47
Оценка:
Здравствуйте, cadet354, Вы писали:

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


П>>Только что-то не нравится мне перспектива оборачивания функциональных типов в делегаты...

C>чем не нравиться,только из-за чистоты, уж не думаю, что там производительность просядет, или что немцу хорошо то русскому смерть?

Мне сам факт не нравится, а может и просядет Возмём:
let func = (+)
let deleg = System.Func<_,_>(func)
Посмотрим на это "с изнанки":
[Serializable]
internal class func@7 : OptimizedClosures.FSharpFunc<int, int, int>
{
    internal func@7() { }

    public override int Invoke(int x, int y)
    {
        return (x + y);
    }
}

public static void main@()
{
    FSharpFunc<int, FSharpFunc<int, int>> func = func@7 = new File2.func@7();
    Func<int, int, int> deleg = deleg@9 = new Func<int, int, int>(new File2.deleg@9().Invoke);
}
Обращаем внимание, что выделенный метод Invoke() — это виртуальный метод generic-класса FSharpFunc<,,>.

Теперь читаем статью:
http://tips.x-tensive.com/2008/10/method-call-performance.html

И обращаем внимание на фразу:

Creating a delegate pointing to generic virtual method time is 1000x.


Конечно делегат создавать надо только один раз, при формировании IObservable из цепочки методов... но всё же три порядка
Проверить лень, рад буду ошибаться...
Re[12]: [ANN] Reactive Extensions for .NET (Rx)
От: Пельмешко Россия blog
Дата: 23.11.09 17:51
Оценка: 8 (1)
Здравствуйте, cadet354, Вы писали:

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


П>>Только что-то не нравится мне перспектива оборачивания функциональных типов в делегаты...

C>чем не нравиться,только из-за чистоты, уж не думаю, что там производительность просядет, или что немцу хорошо то русскому смерть?

Прогнал я простой тестик, то ли наврали в той статье, то ли JIT допилили с конца 2008 года:
Delegate creation time (10000000 iterations) results:

Test #1 Interface method: 00:00:00.9326484 (932 ms)
Test #2  Virtual generic: 00:00:00.8832418 (883 ms)
Test #3  Instance method: 00:00:00.3833311 (383 ms)
Test #4    Static method: 00:00:00.2927472 (292 ms)


Что то не видно тут "1000x"... Сойдёт короче
Re: [ANN] Reactive Extensions for .NET (Rx)
От: desco США http://v2matveev.blogspot.com
Дата: 19.12.09 07:59
Оценка: 23 (2)
Здравствуйте, Пельмешко, Вы писали:

<skipped/>

Build 1.0.2144.0 12/18/2009
DevLabs: Reactive Extensions for .NET (Rx)

Release notes:

* License changes based on forum feedback
* Add FromAsyncPattern to Silverlight
* Remove Observable.Context and replace with IScheduler mechanism.
* Perf fixes for Last*,First* and Single*. Adding Any, All
* Additional StartWith overloads
* Fix bug in EnumerableEx.Memoize
* Fix bug in EnumerableEx.Retry
* Fix bug in EnumerableEx.Merge
* Add ObserveOn & SubscribeOn for Control and Dispatcher schedulers
* Removed all time based operators which takes an Int instead of a TimeSpan or DateTime
* Generalized the Using operator by adding a type parameter TResource constrained to implement IDisposable
* Renamed BufferWithTime to Buffer since there is no ambiguity between the two now
* Renamed Until to TakeUntil
* Renamed WaitUntil to SkipUntil
* Added various disposables in System.Disposables
* Fixed a bug in Observable.Join
* Added Observable.IsEmpty
* Changed DateTime to DateTimeOffset
* Setup will automatically uninstall previous releases
Re[2]: [ANN] Reactive Extensions for .NET (Rx)
От: Пельмешко Россия blog
Дата: 19.12.09 11:31
Оценка:
Здравствуйте, desco, Вы писали:

D> * Generalized the Using operator by adding a type parameter TResource constrained to implement IDisposable


Вот только для IEnumerable<T> такую же шляпу забыли
Не понятно почему сразу нельзя было сделать generic-версию с contraint'ом, там и так всё обобщено насколько можно...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.