У меня есть несколько потоков, которые вызывают метод. Это выглядит примерно так:
public void DoWork(params int[] initialConditions)
{
//Do a lot of work
}
Однако, если условия быстро меняются, я получаю много устаревших промежуточных результатов, потому что не могу достаточно быстро завершить вычисления. Я знаю! Я изменю код так, чтобы он выглядел так:
public void DoWork(params int[] initialConditions)
{
if(Monitor.TryEnter(syncLock)
{
//Do a lot of work
Monitor.Exit(syncLock);
}
}
Теперь я не буду потрудиться делать вычисления, пока мои предыдущие вычисления не будут закончены. Я буду немного отставать в быстро меняющихся ситуациях, но не больше, чем был бы, и я не буду тратить свое время на выполнение всей этой дополнительной работы для устаревших результатов.
Однако,
Как только ситуация перестает меняться, я все еще немного устарел, и последний поток, который хотел вызвать DoWork, давно ушел. Есть ли способ сообщить нить:
if no one is doing work
do work
else
wait to do work until after the other thread finishes
but
if a new thread arrives before you start doing work, leave without doing work.