Есть ли смысл использовать lock в приведенном коде? - C#
Формулировка задачи:
Я правильно понимаю, что lock в данном случае не имеет смысла (см.
LostConnectionWithController
)? Это Callback на стороне клиента. [CallbackBehavior(UseSynchronizationContext = false)]
public class DataServiceCallback : IDataServiceCallback
{
private ControllerDisconnectedViewModel _ctrllerDisconnectVm;
private static readonly object _lostConnectionWithController = new object();
/// <summary>Потеряно соединение с PLC</summary>
public void LostConnectionWithController()
{
Task.Factory.StartNew(() =>
{
try
{
lock (_lostConnectionWithController)
{
DispatcherHelper.UIDispatcher.Invoke(() =>
{
if (!WindowManager.Instance.IsPlcDisconnectedDialogOpened)
{
_ctrllerDisconnectVm = WindowManager.Instance.OpenControllerDisconnectedDialog();
_ctrllerDisconnectVm.CountdownTimerStopped +=
ControllerDisconnectVm_CountdownTimerStopped;
var main = ServiceLocator.Current.GetInstance<MainViewModel>();
main.IsConnectedWithPlc.State = false; //блокируем частично UI
main.IsControllerBusy.State = true;
main.UpdateConnectionState();
}
else
WindowManager.Instance.ResetShutdownCounterDisconnectedDialog();
//Сброс обратного отсчёта
});
}
}
catch (Exception ex)
{
LogManager.Current.Log.AppendException(ex);
}
});
}
//Таймер во вью модели останавливается, окно "Потеряно соединение с контроллером" закрывается
void ControllerDisconnectVm_CountdownTimerStopped(object sender, EventArgs e)
{
DispatcherHelper.UIDispatcher.Invoke(() =>
{
var controllerDisconnectVm = (ControllerDisconnectedViewModel)sender;
controllerDisconnectVm.CountdownTimerStopped -= ControllerDisconnectVm_CountdownTimerStopped;
var main = ServiceLocator.Current.GetInstance<MainViewModel>();
main.IsConnectedWithPlc.State = true; //включаем ранее частично заблокированный UI
main.IsControllerBusy.State = false;
main.UpdateConnectionState();
});
}
}Решение задачи: «Есть ли смысл использовать lock в приведенном коде?»
textual
Листинг программы
DispatcherHelper.UIDispatcher.BeginInvoke(() =>
{
try
{
}
catch (Exception ex)
{
LogManager.Current.Log.AppendException(ex);
}
});