Можно ли использовать Reactive Extensions (Rx) для создания приложений в .NET 3.5, которые выполняют распараллеливание, или это каким-то образом ограничено? Я скачал Rx отсюда http://www.microsoft.com/download/en/confirmation.aspx?id=26649, и после создания простого проекта со ссылками на реактивные сборки мне не удалось найти никаких классов, соответствующих задачам в .NET 4.0. Я пытаюсь найти классы для «Задачи», но, увы, не могу их найти. Я делаю что-то неправильно?
Аналог Threading.Tasks в расширениях Rx в .NET 3.5?
Ответы (6)
Возможно, вам помогут образцы из rx wiki.
Самая простая фоновая задача:
var o = Observable.Start
(
() =>
{
Console.WriteLine("Calculating...");
Thread.Sleep(3000);
Console.WriteLine("Done.");
}
);
o.First(); // subscribe and wait for completion of background operation
Но вы также можете посмотреть примеры forkjoin.
Как некоторые здесь упоминали, вы можете найти System.Threading.dll
в старой установке Rx
.
Для упрощения интеграции я сделал из него nuget (под названием TaskParallelLibrary).
Вы можете получить его из http://nuget.org/packages/TaskParallelLibrary.
Насколько мне известно, последняя версия реактивных расширений, включающая "обратно перенесенная автономная DLL с именем System.Threading.dll "- это Reactive Extensions (Rx) v1.0.2856.0 от 11.02.2011 (в Rx_Net35.msi).
(На самом деле я получил его как Rx_Net35.v1.0.2856.0.msi, загруженный в мае, я думаю, с CodePlex; больше не могу найти ... он установлен как C:\Program Files (x86)\Microsoft Cloud Programmability\Reactive Extensions\v1.0.2856.0\Net35\System.Threading.dll
в моей 64-битной системе.)
System.Threading, сборка для TPL, которая раньше была включена в выпуски Rx, но больше не включена.
Возможно, вы сможете найти его в более старых версиях.
При этом IObservable<T>
аналогичен Task<T>
с тем отличием, что Task<T>
может иметь только 1 результат, а IObservable<T>
- это поток из 0 или более результатов.
Rx в .NET 3.5 не может использовать задачи, он использует пул потоков .NET 3.5, однако, как говорит Скотт, IObservable работает как Task, когда IObservable состоит из одного элемента.
Пожалуйста, поправьте меня, если я где-то ошибаюсь.
Наблюдатели и наблюдатели в основном связаны с задачей - Наблюдать (ждать данных) и Подписка (чтобы наблюдатели получали данные, которые отправляются).
Observable предоставляет два оператора для повышения производительности двух вышеуказанных задач.
1). Observable.ObserveOn - асинхронно уведомляет наблюдателя по указанному расписанию. Задача может быть выполнена лучше с помощью Schedular, где он принимает аргумент либо
- Scheduler.CurrentThread (наблюдать за текущим запущенным потоком)
- Scheduler.NewThread (наблюдать каждый раз в новом потоке)
- Scheduler.TaskPool (Понаблюдайте за использованием механизма TaskPool, я думаю, вам может быть интересно.)
- Scheduler.ThreadPool (обратите внимание на механизм ThreadPool)
то же самое и со вторым ....
2). Observable.SubscribeOn - Асинхронная подписка - отписывать наблюдателей от указанных планировщиков.
Он также имеет те же параметры, что и выше, для планирования подписки.
Таким образом, Rx предоставляет встроенные возможности для планирования вашего процесса для получения быстрых результатов.