Сопрограммы в C#

Я смотрю на способы реализовать сопрограммы (пользователь запланировал потоки) в c#. При использовании C++ я использовал волокна. Я вижу на интернет-волокнах, не существуют в C#. Я хотел бы получить схожую функциональность.

Там какой-либо "правильный" путь состоит в том, чтобы реализовать сопрограммы в c#?

Я думал о реализации этого использования потоки, которые получают единственное взаимное исключение выполнения + 1 на потоке планировщика, который выпускает это взаимное исключение для каждой сопрограммы. Но это кажется очень дорогостоящим (это вызывает контекстное переключение между каждой сопрограммой),

Я также видел функциональность итератора урожая, но поскольку я понимаю, что Вы не можете уступить во внутренней функции (только в исходной функции ienumerator). Таким образом, это делает меня мало пользы.

40
задан roundcrisis 10 May 2013 в 16:39
поделиться

2 ответа

Edit: You can now use these: Есть ли fiber api в .net?

Я считаю, что вам следует обратить внимание на Reactive Extensions for .NET. Например, coroutines можно имитировать с помощью итераторов и оператора yield.

Однако, возможно, вы захотите прочитать и этот вопрос SO.

12
ответ дан 27 November 2019 в 01:57
поделиться

Вот пример использования потоков для реализации coroutines:

Так что я жульничаю. Я использую потоки, но я только позволяю одному из них работать одновременно. Когда я создаю корутину, я создаю поток, а затем выполняю некоторое рукопожатие, которое заканчивается вызовом Monitor.Wait(), который блокирует поток coroutine - он не будет выполняться до тех пор, пока не будет разблокирован. Когда наступает время обратиться к корутине, я выполняю передачу, которая заканчивается тем, что вызывающий поток заблокирован, а поток coroutine runnable. То же самое передача на обратном пути.

Эти передачи довольно дорогие, по сравнению с другими реализациями. Если вам нужна скорость, вы захотите написать свою собственную машину состояний и избежать всего этого переключения контекста. (Или вы захотите использовать оптоволоконную среду выполнения время выполнения - переключение волокон довольно дешево.) Но если вам нужен выразительный код, я думаю, что корутины имеют некоторые перспективы.

6
ответ дан 27 November 2019 в 01:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: