2010-03-01 1 views
3

Для некоторого параллельного кода я хочу подключить связку сигналов вместе, как схема. В .NET мы можем сделать WaitAll или WaitAny в наборе сигналов. Я хочу сделать что-то вроде этого:Как подключить сигналы в сложные схемы в .NET?

WaitAny (WaitAll (c1, c2), WaitAll (c3, c4)) ; 

К сожалению, библиотека не поддерживает составление этих операций в более сложные деревья. Мои вопросы: (1) Есть ли способ сделать это в .NET? (2) Есть ли библиотека для этого на любом языке?

[править: Cory попросил более подробно]

Я хочу построить передачу сообщений библиотеку. Могут быть 10K небольших параллельных очередей, некоторые с сообщениями. Я хочу получить сообщение из очереди и выполнить обработчик, назначенный для очереди. Тем не менее, я не могу захватить следующее сообщение до тех пор, пока обработчик не будет выполнен (однопоточно для каждой очереди). Так что я действительно хочу ждать в очереди (получил сообщение?) И код (закончил с предыдущим сообщением?), Прежде чем появляться и выполнять следующий элемент.

ответ

1

Я не могу даже поверить, что предлагаю это, но вы могли бы использовать другие потоки, которые вызывали бы вызовы WaitAll и вызывали отдельные сигналы (по одному уникальному для каждой группы WaitAll), которые вы слушаете в WaitAny. Запах очень плохой и кажется слишком сложным для чего-то, что должно быть простым. Я, вероятно, пожалеете нажав Post Your Answer ;-)

ManualResetEvent _Group1Event = new ManualReset(false); 
ManualResetEvent _Group2Event = new ManualReset(false); 

void SomeThread() 
{ 
    ... 
    WaitHandle.WaitAny(_Group1Event, _Group2Event); 
    ... 
} 

void Group1WatcherThread() 
{ 
    ... 
    if (WaitHandle.WaitAll(c1, c2)) 
    { 
     _Group1Event.Set(); 
    } 
    ... 
} 

void Group2WatcherThread() 
{ 
    ... 
    if (WaitHandle.WaitAll(c3, c4)) 
    { 
     _Group2Event.Set(); 
    } 
    ... 
} 

Не уверен, что на моем вызове метода WaitAll/WaitAny но пример просто имел в виду, чтобы продемонстрировать идею не обеспечить полное решение.

+0

Я не могу поверить, что я upvoting это тоже. :) – Tanzelax

+0

К сожалению, это выделило бы поток для каждого поддерева в схеме. Я хочу почти 10 тыс. Из них, поэтому это не будет масштабироваться. Дизайн API затруднен, потому что, например, как бы возвращаемое значение сообщило вам, какое поддерево фактически вызвано в WaitAny? Подумайте о действительно сумасшедших глубоких деревьях сигналов. – projectshave

+0

@projectshave: Ya нить в группе не будет масштабироваться, но вы можете создать один поток, отвечающий за 'WaitAll', с небольшими таймаутами. Все еще не масштабируемо. WaitAny возвращает индекс объекта в массиве, который вы передали, чтобы вы знали, какой сигнал был уволен. Возможно, вы можете обновить свой вопрос с помощью базовой проблемы, которую вы пытаетесь решить, и у кого-то может быть лучшее решение, чем метод WaitAny (WaitAll(), WaitAll()), который вы описываете. –

-1

Я не верю, что поддержка этого в .NET отсутствует на любом языке. Мне придется делать это с использованием примитивов низкого уровня.

+0

Да, теперь есть путь, Rx Extensions. –

+0

Если вы обновите свой ответ, я могу отменить голосование. Я не собирался голосовать здесь. –

1

Возможно, у меня возникла непонимания. Но реактивная структура (Rx) будет тем, что вы ищете. Это должно позволить настраиваемые события таким образом, который вы ищете.

http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx

Смежные вопросы