У нас очень высокая производительность многозадачности, около С# приложения реального времени. Эта работа была достигнута в первую очередь за счет внедрения совместной многозадачности на дому с помощью планируемого на дому планировщика. Это часто называют микропотоками. В этой системе все задачи взаимодействуют с другими задачами через очереди.
Конкретная проблема, которую мы имеем, только разрешима с помощью продолжений первого класса, которые С# не поддерживает.
В частности, проблема возникает в двух случаях, связанных с очередями. Всякий раз, когда какая-либо конкретная задача выполняет какую-либо работу перед размещением элемента в очереди. Что делать, если очередь заполнена?
И наоборот, другая задача может выполнять некоторую работу, а затем нужно удалить элемент из очереди. Что делать, если эта очередь пуста?
Мы решили это в 90% случаев, связывая очереди с задачами, чтобы избежать вызова задач, если какая-либо из их исходящих очередей заполнена, или входящая очередь пуста.
Кроме того, некоторые задачи были преобразованы в конечные машины, чтобы они могли обрабатывать, если очередь заполнена/пуста и продолжается без ожидания.
Реальная проблема возникает в нескольких краевых случаях, когда делать одно из этих решений нецелесообразно. Идея в этом сценарии состояла в том, чтобы сохранить состояние стека в точке и переключиться на другую задачу, чтобы она могла выполнять работу, а затем повторять задачу ожидания всякий раз, когда она может продолжить.
В прошлом мы пытались вернуть вызов ожидающей задачи в расписание (рекурсивно), чтобы другие задачи выполняли и затем выполняли повторную задачу ожидания. Однако это привело к слишком многим "тупиковым" ситуациям.
Был пример где-то из пользовательского хоста CLR, чтобы потоки .NET фактически работали как "волокна", которые по существу позволяют переключать состояние стека между потоками. Но теперь я не могу найти какой-либо образец кода для этого. Плюс, кажется, что это займет некоторую значительную сложность, чтобы исправить это.
Есть ли у кого-нибудь другие креативные идеи, как эффективно переключаться между задачами и избегать вышеуказанных проблем?
Есть ли другие хосты CLR, которые предлагают это, коммерческое или иное? Есть ли какая-либо добавочная библиотека, которая может предложить некоторую форму продолжения для С#?