То, что (я думаю) я хочу, это эквивланта AutoResetEvent
, который может ждать несколько потоков, и все это будет возобновлено, когда он установлен.
Я знаю, что этого можно достичь, имея один AutoResetEvent
на поток и устанавливая каждый из них - но есть ли более простой способ? Способ, который не зависит от массивов дескрипторов событий?
Эффективно, что (я думаю) я бы хотел иметь возможность сделать это:
private volatile string state;
private MultiEventHandle stateChanged = new MultiEventHandle();
public void WaitForBlob()
{
while (true)
{
object saved = stateChanged.Current; // some sentinel value
if (state == "Blob") break;
stateChanged.WaitTilNot(saved); // wait til sentinel value != "current"
}
}
public void SetBlob()
{
state = "Blob";
stateChanged.Change(); // stateChanged.Current becomes a new sentinel object
}
т. Е. Любое число потоков может вызвать WaitForBlob
, и в любое время (без условий гонки) SetBlob
может быть вызвано еще одним потоком, и все ожидающие потоки обнаружат изменение немедленно - и, что важно, без Спин-замки или Threading.Sleeps.
Теперь я думаю, что могу относительно легко реализовать "MultiEventHandle
". Но мой вопрос ... есть ли лучший способ? Конечно, я ошибаюсь, потому что это довольно распространенный случай, но я не могу найти встроенный инструмент для этой работы. Боюсь, я собираюсь изобрести здесь квадратное колесо ..