Здравствуйте, Аноним, Вы писали:
А>Наблюдаю за развитием 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).