У меня есть функция на C #, которую можно вызывать несколько раз из нескольких потоков, и я хочу, чтобы это выполнялось только один раз, поэтому я подумал об этом:
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
, чтобы этот ручной способ и lock
блокировали друг друга (для более сложных случаев).