Если все, что вы ищете, это индикатор того, что что-то используется, вам, вероятно, лучше использовать счетчик, а не простой логический флаг. Затем вы можете использовать Interlocked.Increment
и Interlocked.Decrement
для изменения значения в поточно-ориентированном режиме.
Объявите это на уровне класса:
private volatile int isBusyCounter;
Interlocked.Increment(ref isBusyCounter);
_personRequested = true;
_service.GetPerson((person, error) =>
{
if (error != null)
{
return;
}
_person = person;
_personLoaded = true;
Interlocked.Decrement(ref isBusyCounter);
});
(Использование Interlocked
необходимо, поскольку вы изменяете значение в нескольких потоках, и это гарантирует, что обновления не конфликтуют друг с другом; нас не волнует порядок, так как вы закончите с одним и тем же значением, случается ли одно первым или другим)
Тогда, вместо того, чтобы просто проверять IsBusy
, проверьте IsBusy > 0
. Переменная должна быть volatile
, чтобы последующие чтения переменной в методе не оптимизировались (другими словами, если вы проверяете это условие в цикле или несколько раз в рамках данной функции, то мы помещаем volatile
, чтобы гарантировать, что значение проверяется каждый раз, а не кэшируется локально).