Как подключить сигналы в сложные схемы в .NET? - PullRequest
3 голосов
/ 02 марта 2010

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

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

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

[редактировать: Кори попросил более подробную информацию]

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

Ответы [ 3 ]

1 голос
/ 12 марта 2010

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

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

1 голос
/ 02 марта 2010

Я даже не могу поверить, что я предлагаю это, но у вас могут быть другие потоки, выполняющие вызовы 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 голосов
/ 12 марта 2010

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

...