从另一个线程ShowDialog并获得结果

时间:2014-02-04 21:50:23

标签: .net multithreading winforms

我想从辅助线程(不是GUI)显示一个对话框。 主窗体有一种显示第二种形式的方法

    public string ShowDialogSafe()
    {
        if(this.InvokeRequired)
            return (string)Invoke(new MethodInvoker(() => ShowDialogSafe()));
        else
        {
            var frm = new Form2();
            if(frm.ShowDialog() == DialogResult.OK)
                return frm.MyResult;
            return String.Empty;
        }
    }

可以安全地从辅助线程调用它吗?

string s = this.ShowDialogSafe();

在用户关闭Form2之前,是否会阻止辅助线程?

EDIT 为什么它不安全? 不调用()保证Form2及其控件是在GUI线程上创建的吗?

1 个答案:

答案 0 :(得分:1)

是的,此代码应该有效。 Invoke是一个阻塞操作,因此非gui-thread正在等待,直到调用的方法完成。 但通常情况下,您只会将非gui代码放入后台线程,并在gui线程中显示UI元素(例如,在BackgroundWorker的进度事件中或任务完成时...)