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

C# 从线程生成模式对话框的最短代码,c#,winforms,C#,Winforms,假设我有一个线程一直在后台运行,以确定URL是否可访问。如果URL不可访问,则应用程序需要显示一个模式对话框。如果URL关闭,事情就无法继续。如果我只是从线程内部执行MessageBox.show,那么该消息框将不会是模态的。ShowDialog也无法工作。您可能需要使用Control.Invoke(或this.Invoke) 这将使它成为UI线程的模态。您可能需要使用Control.Invoke(或this.Invoke) 这将使它成为UI线程的模态。您可以尝试创建从后台线程触发的事件。让主窗

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

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


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

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


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

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

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

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线程上调用该委托


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

谢谢大家。我这样解决了这个问题:

线程:

private Thread tCheckURL;

// ...

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

public delegate void AddListItem();
public AddListItem myDelegate;

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

不确定这是不是最短的方法。。但是它完成了任务。

谢谢大家。我这样解决了这个问题:

线程:

private Thread tCheckURL;

// ...

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

public delegate void AddListItem();
public AddListItem myDelegate;

Form1()
{
    //...
    myDelegate = new AddListItem(ShowURLError);
}
public void ShowURLError()
{
    MessageBox.Show("The site is down");
}
不确定这是不是最短的方法。。但它完成了任务