Я использую внешнюю платформу, которая определяет интерфейс одним методом:
bool Authenticate();
, который должен содержать весь процесс аутентификации, включая взаимодействие с пользователем (WinForms).Я хотел бы сделать что-то вроде:
bool Authenticate()
{
bool succeeded = false;
bool userCancelled = false;
while(!succeeded && !userCancelled)
{
var credentials = AskTheUserForCredentials(); // this needs to wait for user input before returning!
if (credentials == null)
userCancelled = true;
else
succeeded = AuthenticateWithAnExternalServer(credentials);
if (!succeeded)
ShowErrorMessage();
}
return succeeded;
}
Теперь самый простой способ реализовать AskTheUserForCredentials()
и ShowErrorMessage()
- это использовать Form.ShowDialog()
внутри.Это действительно плохой пользовательский интерфейс, так как диалоговое окно для самого процесса аутентификации исчезает, а сообщение об ошибке появляется в новом диалоговом окне, которое нужно щелкнуть, чтобы закрыть.
Я бы предпочел, чтобы все это было в единой форме, которая остается видимой, соответствующим образом отключает текстовые поля / кнопки и отображает сообщение об ошибке.
Как бы вы сделали это в этом сингле,вызов метода блокировки?
ОБНОВЛЕНИЕ
На сегодняшний день лучшее решение - внедрить насос сообщений внутри AskTheUserForCredentials()
:
Credentials AskTheUserForCredentials()
{
while(NeitherOkNorCancelPressed())
{
Application.DoEvents();
Thread.Sleep(10); // Standard Sleep(0) results in 100% procesor core usage.
}
return CreateCredentialsFromTextboxesEtc();
}
Теперь мы всеЗнайте, что насосы сообщений далеки от чистоты.
Насколько плохо это решение?
Что-нибудь лучше?
ОБНОВЛЕНИЕ 2
Насос сообщений имел несколько ловушек:
В итоге я делегировал весь процесс диалогу как ChrisBD (диалог закрывается только после окончательного успеха или неудачи).Это заняло больше времени, чтобы абстрагировать аутентификацию от GUI с помощью IoC, но в конечном итоге все чисто и работает как задумано.