从外部线程关闭模态对话框 - C#

9

我正在努力寻找一种使用C#创建所需表单功能的方法。

基本上,我想要一个具有指定超时期限的模态对话框。看起来这应该很容易实现,但我似乎无法让它工作。

一旦我调用 this.ShowDialog(parent),程序流程就会停止,而且我没有办法在用户首先单击按钮之前关闭对话框。

我尝试使用BackgroundWorker类创建新线程,但我无法在不同的线程上关闭对话框。

我是否漏掉了什么明显的东西?

感谢您提供的任何见解。

4个回答

12
您需要调用创建该窗体的线程的Close方法:
theDialogForm.BeginInvoke(new MethodInvoker(Close));

11

使用 System.Windows.Forms.Timer,将其Interval属性设置为超时时间并将Tick事件处理程序设置为关闭对话框。

partial class TimedModalForm : Form
{
    private Timer timer;

    public TimedModalForm()
    {
        InitializeComponent();

        timer = new Timer();
        timer.Interval = 3000;
        timer.Tick += CloseForm;
        timer.Start();
    }

    private void CloseForm(object sender, EventArgs e)
    {
        timer.Stop();
        timer.Dispose();
        this.DialogResult = DialogResult.OK;
    }
}
计时器在UI线程上运行,因此可以安全地从Tick事件处理程序中关闭窗体。

4
如果您只需要一个模态对话框,那么我发现这是迄今为止最好的解决方案:http://www.codeproject.com/KB/miscctrl/CsMsgBoxTimeOut.aspx(阅读评论部分以获取小修改)。
如果您想要以模态方式显示自己的表单,则adrianbanks的解决方案最佳。

1

你可以从后台线程调用关闭操作


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接