У меня есть функция в С#, которая может быть вызвана несколько раз из нескольких потоков, и я хочу, чтобы это было сделано только один раз, поэтому я подумал об этом:
class MyClass
{
bool done = false;
public void DoSomething()
{
lock(this)
if(!done)
{
done = true;
_DoSomething();
}
}
}
Проблема _DoSomething
занимает много времени, и я не хочу, чтобы многие потоки ожили, когда они могут просто увидеть, что done
является истинным.
Что-то вроде этого может быть обходным путем:
class MyClass
{
bool done = false;
public void DoSomething()
{
bool doIt = false;
lock(this)
if(!done)
doIt = done = true;
if(doIt)
_DoSomething();
}
}
Но просто делать блокировку и разблокировку вручную будет намного лучше.
Как я могу вручную заблокировать и разблокировать, как это делает lock(object)
? Мне нужно использовать тот же интерфейс, что и lock
, чтобы этот ручной способ и lock
блокировали друг друга (для более сложных случаев).