Используйте приложение/JavaScript. Таким образом клиенты могут полагаться на тип контента, не имея необходимость вручную проверять, имеет ли ответ дополнение или нет.
Вам необходимо создать отдельный объект блокировки. Проблема в том, что вы повторно назначаете t_x внутри цикла. Предполагая, что поток b1 попадает внутрь цикла до того, как b2 переходит к оператору блокировки, b2 будет разрешен внутри оператора блокировки, потому что к тому времени t_x будет новым объектом, на котором не будет блокировки.
Нет, вы не можете этого сделать - блокировка является сокращением для следующего:
try(Monitor.Enter(lockObject))
{
//critical section
}
finally
{
Monitor.Exit(lockObject)
}
В документации для Monitor.Enter указано: «Используйте Monitor для блокировки объекты (то есть ссылочные типы), а не типы значений. Когда вы передаете переменную типа значения в Enter, она помещается в рамку как объект. Если вы снова передадите ту же переменную в Enter, она будет заключена в отдельный объект, и поток не блокируется "
Вызов блокировки (t_x) помещает целое число в качестве временного объекта. Каждый вызов lock (t_x) создает новый объект, и блокировка бесполезна.
(Lock ожидает объект и создает НОВЫЙ временный объект из целого числа)
Просто создайте отдельный объект блокировки, как сказано выше Фемарефом.
Если вы действительно хотите (нужно?) Чтобы заблокировать объект, вы можете использовать своего рода оболочку:
public class IntWrapper
{
public int Value{get;set;}
}
Или, если вам нужно оставаться более абстрактным:
public class ObjectWrapper
{
public Object Value { get;set; }
}
Вы должны использовать дополнительный объект для блокировки
object lockObj = new object();
public void foo()
{
lock(lockObj)
{
//do stuff here
}
}