A-la легкие потоки
От: jedi Мухосранск  
Дата: 01.07.09 08:24
Оценка:
Вопрос больше философский, поэтому сильно не пинайте.

Хочется иметь гарантию, что процедуры завершения для какого-либо объекта, поддерживающего асинхронные операции, будут вызываться в одном и том же потоке.
Дабы избавиться от лишней синхронизации.

Например. Серверное приложение, зааксептили соединение от клиента, привязали его к какому-то потоку (к какому — неважно. например, к тому который сейчас меньше всего клиентов обслуживает). Затем, оповещения о всех наших асинхронных операциях на этом сокете приходят в этот поток. Т.е. сериализованы — синхронизация не нужна.

Далее, если для обслуживания этого клиента нам нужны еще какие-то асинхронные объекты (например файл, таймер, пайп — что угодно), мы всех их привязываем к потоку обслуживающему данного клиента. Таким образом, оповещения о завершении асинхронных операций на этих объектах, опять же приезжают в наш поток. Синхронизации не нужно. Код превращается в аккуратный
конечный автомат безо всяких лишних блокировок (если нужно шарить данные с другими сессиями — там блокироки нужны, если у нас таких потоков больше одного).

Т.е. получаем нечто вроде легких потоков.

В неуправляемом коде (или с использованием интеропа) делается просто — заводим N completion port-ов, N потоков, добавляем некий load-balancer и вуаля.

Есть ли идеи как это реализовать используя родные .NET классы и не городя кучу интеропа? Всем спасибо за идеи
... << RSDN@Home 1.2.0 alpha 4 rev. 1228>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.