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

时间:2009-06-17 22:52:10

标签: c# winforms user-interface

我正在努力找到一种方法来创建我想要使用C#的表单功能。

基本上,我想要一个具有指定超时时间的模式对话框。看起来这应该很容易,但我似乎无法让它发挥作用。

一旦我调用this.ShowDialog(parent),程序流程就会停止,如果没有用户先点击按钮,我就无法关闭对话框。

我尝试使用BackgroundWorker类创建一个新线程,但我不能让它在另一个线程上关闭对话框。

我错过了一些明显的东西吗?

感谢您提供的任何见解。

4 个答案:

答案 0 :(得分:11)

您需要在创建表单的线程上调用Close方法:

theDialogForm.BeginInvoke(new MethodInvoker(Close));

答案 1 :(得分: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事件处理程序中关闭表单。

答案 2 :(得分:3)

如果你真的只想要一个模态对话框,那么我发现这是迄今为止最好的解决方案:http://www.codeproject.com/KB/miscctrl/CsMsgBoxTimeOut.aspx(阅读评论部分进行小修改)。

如果您想以模态方式显示自己的表单,那么adrianbanks的解决方案是最好的。

答案 3 :(得分:1)

你可以Invoke你的后台线程关闭