Как правильно синхронизировать это? На данный момент возможно, что SetData
вызывается после завершения e.WaitOne()
, поэтому d
может быть уже установлен на другое значение. Я попытался вставить замки, но это привело к тупиковой ситуации.Вопрос о выпуске C# с AutoResetEvent
AutoResetEvent e = new AutoResetEvent(false);
public SetData(MyData d)
{
this.d=d;
e.Set(); // notify that new data is available
}
// This runs in separate thread and waits for d to be set to a new value
void Runner()
{
while (true)
{
e.WaitOne(); // waits for new data to process
DoLongOperationWith_d(d);
}
}
будет лучшим решением будет ввести новую булеву переменную dataAlreadyBeenSetAndWaitingToBeProcessed
, которая устанавливается в SetData
к истине и в конце DoLongOperationWith_d
она может быть установлена истиной, так что если SetData
вызывается с этим переменным значением ИСТИНЫ он может просто вернуться?
@ Spencer Ruport: Что? Если в ожидании установлено значение true при первом вызове SetData, тогда он будет бросать второй раз. Я уверен, что есть какой-то способ нарушить это, но я не думаю, что это с той последовательностью, которую вы описали. – Sean
, но this.d не может быть задан, если ожидающим является false. –
Мой плохой. Я не видел 'if (pending)' там. –