我想从辅助线程(不是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线程上创建的吗?
答案 0 :(得分:1)
是的,此代码应该有效。 Invoke是一个阻塞操作,因此非gui-thread正在等待,直到调用的方法完成。 但通常情况下,您只会将非gui代码放入后台线程,并在gui线程中显示UI元素(例如,在BackgroundWorker的进度事件中或任务完成时...)