Возможно, я неправильно помню, как работает Winforms, или я слишком усложняю это, но вот моя проблема.
У меня есть клиентское приложение WPF, которое общается с сервером через WCF. Текущий пользователь может «выйти» из клиента WPF, который закрывает все открытые экраны, оставляет только панель навигации и минимизирует окно программы. Когда пользователь повторно максимизирует окно программы, ему предлагается войти в систему. Простой.
Но иногда вещи происходят в фоновых потоках - например, каждые 5 минут клиент пытается сделать вызовы WCF, которые обновляют некоторые кэшированные данные. А что если пользователь выйдет из системы при срабатывании этого 5-минутного таймера? Что ж, тогда пользователю нужно будет снова войти в систему ... и это, конечно, должно произойти в потоке пользовательского интерфейса.
private static ISecurityContext securityContext;
public static ISecurityContext SecurityContext
{
get
{
if (securityContext == null)
{
// Login method shows a window and prompts the user to log in
Application.Current.Dispatcher.Invoke((Action)Login);
}
return securityContext;
}
}
private static void Login()
{
if (securityContext == null) { \
/* show login window and set securityContext */
var w = new LoginWindow();
w.ShowDialog();
securityContext = w.GetSecurityContext();
}
}
Пока все хорошо, верно? Но что происходит, когда несколько потоков попадают в эту область кода?
Что ж, моя первая интуиция заключалась в том, что, поскольку я синхронизирую приложение.Current.Dispatcher, у меня все будет в порядке, и какой бы поток ни нажал первым, он будет отвечать за отображение формы входа и вход пользователя в систему ...
Не тот случай ...
Поток 1 нажмет код и вызовет ShowDialog в форме входа
Поток 2 также нажмет код и вызовет Login, как только поток 1 вызовет ShowDialog, поскольку вызов ShowDialog разблокирован, поток 1 (я полагаю, из-за того, как работает насос сообщений WPF)
... конечным результатом является то, что у меня одновременно появляется несколько форм входа в систему.
Все, что мне нужно, - это синхронизированный способ входа пользователя в приложение ... что мне здесь не хватает?
Заранее спасибо.