Re[2]: [ANN] Официальный релиз Rx .NET
От: a_vzhik Россия  
Дата: 01.07.11 10:45
Оценка: 37 (3)
Здравствуйте, Аноним, Вы писали:

А>Наблюдаю за развитием Rx уже давно, но никак не могу для себя определить где и как она может мне сгодиться и чем она лучше стандартных средств языка?


Главное преимущество Rx в том, что она позволяет организовать понятный и логичный поток данных. Отчетливо можно проследить условия возникновения и уничтожения вычислительного процесса, переключения между потоками и при этом, в большинстве сценариев, совершенно не нужно думать об особенностях синхронизации (блокировки и ожидание).

Вот, например, простенькая реализация отображения содержимого последнего созданного файла на диске С. Предполагается, что этот код запускается в потоке представления (например, конструктор модели представления).

var scheduler = new SynchronizationContextScheduler(SynchronizationContext.Current);

var watcher = new FileSystemWatcher("c:\\")
        {
            IncludeSubdirectories = true,
            EnableRaisingEvents = true,
        };

// Представление файла в виде обозреваемой коллекции байт. 
Func<string, IObservable<byte[]>> observableFile = 
    filePath => Observable
        .Return(filePath, scheduler) 
        .Do(_ => this.IsLoading = true)
        .SelectMany(path =>  new FileStream(path, FileMode.Open).AsyncRead(2>>16))
        .ObserveOn(scheduler)
        .Finally(() => this.IsLoading = false);

Observable
    .FromEvent<FileSystemEventArgs>(watcher, "Created")
    .Do(e => scheduler.Schedule(this.Document.Clear())) 
    .Select(e => observableFile(e.EventArgs.FullPath))
    .Switch()
    .ObserveOn(scheduler)
    .Subscribe(
        bytes => this.Document.Add(bytes),
        error => this.HandleException(error));


В случае реализации средствами .NET — весь этот код будет размазан по одному, а то и нескольким файлам. Например, чтобы отписаться от события, в классе нужно будет заводить поле класса _watcher и метод обработки события. А организация асинхронного чтения вообще уведет в код, оперирующий обертками над IAsyncResult, а это сомнительное удовольсвие. Безусловно, пример несколько надуман, но при должном усердии подход, применяемый в Rx очень хорош. MxMsk уже сказал, что в нашем проекте все асинхронные задачи переведены на Rx (с полноценными отменами, прерываниями, разветвлениями и адекватной реакцией UI).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.