从线程生成模式对话框的最短代码

时间:2008-12-30 02:12:23

标签: c# winforms

假设我有一个在后台运行的线程,以确定URL是否可访问。如果URL不可访问,则应用程序需要显示模式对话框。如果URL关闭,事情就无法继续。如果我只是从线程内部执行MessageBox.show,那么该消息框将不是模态的。 ShowDialog也不起作用。

4 个答案:

答案 0 :(得分:4)

您可能想要使用Control.Invoke(或this.Invoke)

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {
      this.Invoke(new MessageBoxDelegate(ShowMessage), "Title", "MEssage", MessageBoxButtons.OK, MessageBoxIcon.Information);    }

这将使其成为UI线程的模态。

答案 1 :(得分:2)

您可以尝试创建从后台线程触发的事件。让主窗体监听事件,在这种情况下,它将以模态形式触发消息框。虽然我更喜欢ocdecio建议的方法。

答案 2 :(得分:2)

谢谢大家。我用这种方式解决了这个问题:

主题:

private Thread tCheckURL;

// ...

tCheckURL = new Thread(delegate()
{
    while (true)
    {
        if (CheckUrl("http://www.yahoo.com") == false)
        {
            form1.Invoke(form1.myDelegate);
        }
    }
});
tCheckURL.Start();

在Form1中:

public delegate void AddListItem();
public AddListItem myDelegate;

Form1()
{
    //...
    myDelegate = new AddListItem(ShowURLError);
}
public void ShowURLError()
{
    MessageBox.Show("The site is down");
}

不确定这是否是最简单的方法..但它完成了工作。

答案 3 :(得分:1)

public class FooForm : Form {

    public static void Main() {
        Application.Run(new FooForm());
    }

    public FooForm() {
        new Thread(new Action(delegate {
            Invoke(new Action(delegate {
                MessageBox.Show("FooMessage");
            }));
        })).Start();
    }

}

这个程序创建一个表单窗口,并立即创建另一个非gui线程,它想在窗体的gui线程上弹出一个模态对话框窗口。表单的Invoke方法接受一个委托并在表单的gui线程上调用该委托。