Используя такие системы, как Parallel Linq, можно разделить выполнение анонимных функций, запросов и т. Д. Между несколькими ядрами и потоками на одном компьютере.Мне бы хотелось иметь возможность расширять его для работы на нескольких машинах, используя стандартные языковые конструкции, такие как циклы for (например, Parallel.For ()), типы значений, такие как int, структуры и т. Д., И сводить к минимуму модификации исходного кода приложения..
Звучит отлично.На самом деле, у нас очень похожая система в Microsoft Research, хотя, очевидно, я не могу обсуждать детали.
Мне нужна возможность захвата скомпилированного блока кода (такого как лямбда) ипередать его рабочему процессу, работающему на другом узле, вместе с любыми необходимыми данными
ОК, вы получили его.Мы добавили эту функцию в C # 3. Вот как работает LINQ to SQL. Каким-то образом запрос LINQ должен попасть в базу данных.Скомпилированная лямбда-запрос запрашивается на клиентском компьютере, преобразуется в запрос, который отправляется на узел сервера, и затем результат отправляется обратно.
Похоже, что Рослин предоставляет некоторые инструменты, которые были бы здесь полезны,Есть ли способ подключиться к текущему конвейеру компиляции, чтобы позволить это?
Это не цель Рослина;Roslyn не о добавлении новых функций в язык C #.Речь идет об упрощении анализа кода для создания таких вещей, как механизмы рефакторинга.
Вам не нужно подключаться к конвейеру компиляции.PLINQ не меняет компилятор, LINQ to SQL не меняет компилятор и так далее.Когда вы конвертируете лямбду в дерево выражений, компилятор генерирует код, который создает дерево выражений во время выполнения, которое представляет лямбду.Вы можете опросить это дерево выражений, сериализовать его на другом компьютере в вашей сети, десериализовать его, превратить в делегат и запустить, если вам нравится делать это.
Возможно, вам понадобится написать свой собственный сериализатор и десериализатор дерева выражений, но это довольно простые структуры данных.Быть неизменным деревом должно легко их сериализовать и десериализовать;на самом деле они не могут образовывать сложные сети, поскольку они всегда создаются из конечных узлов.