Несколько потоков ожидают одного события?

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

5
задан Mania 24 March 2011 в 10:47
поделиться