Как использовать оператор блокировкиC#

Место общения программистов C#
Ответить
Anonymous
 Как использовать оператор блокировки

Сообщение Anonymous »

Я новичок в попытке использовать операторы блокировки и многопоточное, и не уверен, правильно ли я использую ниже (или это даже необходимо). У меня просто есть System.timers.timer Запуск мониторинга условия, но мне нужно избегать проверки этого условия, когда основное приложение занято «синхронизирующим», поэтому я устанавливаю логический флаг при уведомлении основного приложения, что оно синхронизирует, и устанавливает этот флаг в рамках блокировки. Это правильный способ управления многопоточным в этом сценарии? Необходимо ли оператор блокировки? У меня также есть блокировка методов, которые инициализируют и останавливают таймер (Activate и deactivate ) - Они оба будут вызваны в основной поток приложения.
public static class Monitor
{
private static bool _isActive = false;
private static System.Timers.Timer _timer;
private static readonly object _lock = new();

public static void Activate()
{
lock ( _lock )
{
if (!_isActive)
{
_isActive = true;
_timer = new System.Timers.Timer(100);
_timer.Elapsed += OnTimerElapsed;
_timer.Start();
App.Synchronizing += SyncBeginning;
App.Synchronized += SyncComplete;
}
}
}

public static void Deactivate()
{
lock (_lock)
{
if (_isActive)
{
_timer.Stop();
_timer.Elapsed -= OnTimerElapsed;
_timer.Dispose();
_isActive = false;
}
}
}
private static bool _syncing = false;

private static void SyncBeginning(object sender, EventArgs e)
{
lock (_lock) { _syncing = true; }
}
private static void SyncComplete(object sender, EventArgs e)
{
lock (_lock) { _syncing = false; }
}

private async static void OnTimerElapsed(object sender, ElapsedEventArgs e)
{
if ( _syncing) return;
// Check something
}

}


Подробнее здесь: https://stackoverflow.com/questions/797 ... -statement
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»