我使用的是一个外部框架,它用一个方法定义了一个接口:
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
消息泵有一些缺陷:
cpu-effective
那样慢吞吞
最后,我将整个过程委托给一个对话框为ChrisBD (对话只有在最终成功或失败之后才会关闭)。使用IoC将身份验证从GUI中抽象出来需要花费更多的时间,但最终是干净的,并按预期工作。
发布于 2012-01-04 02:51:42
我想你快到了。
显示一个模态对话框,该对话框具有用户输入控件,并在需要时让该对话框调用验证方法。
然后,您可以选择对话框何时关闭,以及是否显示任何错误消息。
使用模态对话框类的属性指示身份验证是否成功。当您关闭对话框类(在主应用程序以模式打开之前实例化它),主应用程序将继续运行-然后您可以通过检查适当的对话框类属性来检查身份验证是否成功。
*在此编辑*
如果您自己实现了身份验证方法,那么调用模态对话框的是这个函数,而不是您的主应用程序(如前所述)。自定义表单类可以运行所有身份验证逻辑,并显示用户交互控件以及任何错误消息。请记住移除“最小化”和“关闭”按钮,并设置类属性以指示身份验证过程的成功或失败。
调用框架将等待身份验证方法的返回值。
https://stackoverflow.com/questions/8725465
复制相似问题