То, что (я думаю), мне нужно, это эквивалент 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
". Но у меня вопрос ... есть ли способ лучше? Конечно, я ошибаюсь, так как это должно быть довольно распространенный вариант использования, но я не могу найти встроенный инструмент для работы. Я' Боюсь, я собираюсь изобрести здесь квадратное колесо ..