Я правильно использую оператор блокировки? [закрыто]C#

Место общения программистов C#
Ответить
Anonymous
 Я правильно использую оператор блокировки? [закрыто]

Сообщение Anonymous »

Я новичок в попытке использовать операторы блокировки и многопоточное, и не уверен, правильно ли я использую операторы блокировки ниже (или они даже необходимы). У меня есть System.timers.timer Запуск мониторинга условия, но мне нужно избегать проверки этого условия, когда основное приложение занято «синхронизирующим», поэтому я устанавливаю логический флаг при уведомлении основного приложения о том, что оно синхронизирует, и устанавливает этот флаг в сфере блокировки. Это правильный способ управления многопоточным в этом сценарии? Необходимо ли оператор блокировки? У меня также есть блокировка методов, которые инициализируют и останавливают таймер (Activate и deactivate ) - Они оба будут вызваны в основной поток приложения. Нужны ли эти замки? Учитывая, что я также останавливаю и запускаю таймер в OneLapsed , чтобы избежать одновременных выполнений. Если я использую логический флаг, как показано ниже, все работает нормально. Если я этого не сделаю, в хвостовом конце процесса «синхронизации» (который занимает около 1 минуты), основное приложение бросит несколько «управляемых исключений» на несколько тиков таймера на линии, где я пытаюсь получить доступ к идентификатору активного представления < /p>
public static class ViewMonitor
{
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;
App.Synchronizing -= SyncBeginning;
App.Synchronized -= SyncComplete;
}
}
}
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 static int _lastId;

private async static void OnTimerElapsed(object sender, ElapsedEventArgs e)
{
if ( _syncing) return;
int activeViewId = App.ActiveView.Id; // App will throw a "managed exception" at this line if it is busy syncing.
if (_lastId != activeViewId)
{
_timer.Stop();
await App.Dispatcher.BeginInvoke(() =>
{
// raise a "ViewChanged" event on the main thread
});
_lastId = activeViewId;
_timer.Start();
}
}
}


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

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

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

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

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

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