Я смотрю на способы реализовать сопрограммы (пользователь запланировал потоки) в c#. При использовании C++ я использовал волокна. Я вижу на интернет-волокнах, не существуют в C#. Я хотел бы получить схожую функциональность.
Там какой-либо "правильный" путь состоит в том, чтобы реализовать сопрограммы в c#?
Я думал о реализации этого использования потоки, которые получают единственное взаимное исключение выполнения + 1 на потоке планировщика, который выпускает это взаимное исключение для каждой сопрограммы. Но это кажется очень дорогостоящим (это вызывает контекстное переключение между каждой сопрограммой),
Я также видел функциональность итератора урожая, но поскольку я понимаю, что Вы не можете уступить во внутренней функции (только в исходной функции ienumerator). Таким образом, это делает меня мало пользы.
Edit: You can now use these: Есть ли fiber api в .net?
Я считаю, что вам следует обратить внимание на Reactive Extensions for .NET. Например, coroutines можно имитировать с помощью итераторов и оператора yield.
Однако, возможно, вы захотите прочитать и этот вопрос SO.
Вот пример использования потоков для реализации coroutines:
Так что я жульничаю. Я использую потоки, но я только позволяю одному из них работать одновременно. Когда я создаю корутину, я создаю поток, а затем выполняю некоторое рукопожатие, которое заканчивается вызовом Monitor.Wait(), который блокирует поток coroutine - он не будет выполняться до тех пор, пока не будет разблокирован. Когда наступает время обратиться к корутине, я выполняю передачу, которая заканчивается тем, что вызывающий поток заблокирован, а поток coroutine runnable. То же самое передача на обратном пути.
Эти передачи довольно дорогие, по сравнению с другими реализациями. Если вам нужна скорость, вы захотите написать свою собственную машину состояний и избежать всего этого переключения контекста. (Или вы захотите использовать оптоволоконную среду выполнения время выполнения - переключение волокон довольно дешево.) Но если вам нужен выразительный код, я думаю, что корутины имеют некоторые перспективы.