C#延迟模态对话框显示加载,同时允许继续执行

时间:2009-08-17 22:29:12

标签: c# winforms modal-dialog

我有一个静态方法显示的表单。

此静态方法在窗体上调用ShowDialog:

//Static method on LockWaitForm
public static LockDetails Lock(string lockedMessage, object[] params parameters)
{
        using (LockWaitForm form = new LockWaitForm(parameters))
        {
            form._lockedMessage.Text = lockedMessage;

            DialogResult result = form.ShowDialog();

            return new LockDetails (form._lockStatus, form._lock);
        }
 }

我想要的是对话框的OnLoad方法在显示之前等待一秒钟,因此只有在1秒后无法实现对记录的锁定时才会显示。如果在1秒之前获得锁定,将其DialogResult设置为OK,它将在一秒钟之前快乐地退出。

除了隐藏对话框1秒钟外,所有功能都能正常工作。所有'Visible = false'调用都会被忽略,我可以理解为什么他们会这样做。这样做的问题是,每次使用表单时,错误的“记录被锁定”将闪烁一秒,并且可以在没有问题的情况下获得锁定。

我可以找出一些延迟对话框可见性的hacky方法

  • 将不透明度设置为0% - 这不适用于远程桌面连接
  • 只有在1秒钟过后,才能通过静态方法初始化表单。这很有希望,但需要大量重复的静态代码和非静态代码来处理锁的设置和处理,并且仍然感觉有点hacky。

是否可以限制通过ShowDialog调用的模态对话框的显示?我现在不情愿为PInvoke感到高兴(尽管我确实希望限制非64位代码以满足未来的要求)

修改

通过将获取锁定代码移动到表单的构造函数而不是Load,我可以将锁定代码保存在一个位置,并在调用ShowDialog之前等待表单的锁定状态处于等待状态。仍感觉很脏,但到目前为止最干净的方法

3 个答案:

答案 0 :(得分:3)

我会重构应用程序甚至不显示模态对话框,直到锁定进程无法实现锁定一秒钟。

答案 1 :(得分:2)

不确定这会起作用,但是:在你的LockWaitForm中,用您自己的版本覆盖ShowDialog(),调用代码来获取锁(或者它正在做的任何事情),然后如果超过1秒,则调用它。 ShowDialog()(真实的)。这应该允许您只更改LockWaitForm中的代码,而不是其他任何地方。

抱歉,我的Visual Studio笔记本电脑现在位于朋友的行李箱中,所以我无法检查这是否可行。

答案 2 :(得分:1)

什么样的锁?只是一个普通的线程锁?你能使用Monitor.TryEnter吗?

如果返回false,则锁定正忙,您可以弹出某种重试/取消锁定等待窗口。

如果这是真的,那就继续正常生活。

作为一般性评论,我真的同意Eric J,在锁失败之前你不应该显示表格。使用错误对话框执行普通工作流程并尝试在非错误情况下秘密隐藏它似乎很尴尬。

相反,您应该有一个正确的工作流程,完全在错误对话框之外执行锁定,并且只在错误工作流程上弹出对话框。