$myarray->[1]
означает «поиск индекса 1 в массиве, используя ссылку на массив, сохраненную в $myarray
».
$myarray[1]
означает «поиск индекса 1 в массиве @myarray
».
Две переменные $myarray
и @myarray
не имеют никакой связи вообще.
Можно использовать именованное Взаимное исключение или именованный Семафор, чтобы гарантировать, что только один держатель Взаимного исключения/Семафора выполняется сразу. Как комментатор указал, имейте в виду, что необходимо бояться отказываться от взаимного исключения или неправильно получать/выпускать семафор.
Один путь состоял бы в том, чтобы использовать блокировку:
private readonly object myLock = new object();
private void MyMethod()
{
lock(myLock)
{
//code goes here
}
}
Это гарантирует, что этот метод никогда не может работать больше что однажды за один раз.
Я второй Взаимоисключающее предложение, но Вы могли бы также хотеть смотреть на транзакции. Перенесите свой весь код в транзакцию (это требует a using System.Transactions
):
using(TransactionScope scope = new TransactionScope())
{
try
{
/* ... your current code here */
scope.Complete();
}
catch (Exception e)
{
/* Any appropriate error handling/logging here */
}
finally
{
}
}
transactionscope автоматически блокирует все связанные таблицы. Можно уменьшить ограничения и позволить другим процессам читать, но не записать в данные, что процесс затрагивает. Вы делаете это передающими опциями конструктору TransactionsScope.
Хорошо, если весь код локализуется, можно установить булевскую переменную и проверить булевскую переменную прежде, чем выполнить метод, иначе Вы можете IPC и запрашивать состояние перед выполнением.
Некоторые альтернативы:
Я уверен, что существуют другие.
Это походит на последовательный рабочий процесс... Вы рассмотрели использование платформы рабочего процесса?
Если Вы не возражаете ограничивать один поток за один раз всем объектом, то можно использовать:
CLR только позволит одному потоку за один раз выполнять код на экземпляр этого класса. Другие заблокируются, пока блокировка не выпущена текущим потоком.