【发布时间】:2011-10-11 14:43:46
【问题描述】:
我的应用程序有一些异步运行的网络代码。我已经附加了一些在没有连接到服务器时抛出的事件,并且在发生这种情况时我正在创建一些“操作失败”表单。问题是我的表单在创建后挂起。我读到了这一点,并尝试这样做:
public void ShowView()
{
if (this.InvokeRequired)
{
Action a = new Action(ShowView);
this.Invoke(a);
}
else this.Show();
}
问题仍然存在。比我发现,如果没有创建控件,则 InvokeRequired 将返回 false。 所以我在我的初始化代码中添加了:
this.show();
this.hide();
这样它似乎工作了。但它非常难看,当我的应用程序启动时,我可以看到我的表单显示了一会儿然后消失了。 我应该如何让我的表单在不显示的情况下创建所有控件,或者有更好的解决方案吗?
编辑:更多信息。我正在使用 MVP 设计模式。我有依赖于 IView 的 Presenter。我的表单实现了 IView。 IView 有我从演示者那里调用的 ShowView() 和 HideVIew() 方法。我的演示者从另一个线程接收事件。那么我应该在哪里做这个线程跳转或者我应该如何解决这个问题?
EDIT2:这里是说明问题的示例应用程序:
public partial class Form1 : Form
{
Form2 form;
public Form1()
{
InitializeComponent();
form = new Form2();
}
private void button1_Click(object sender, EventArgs e)
{
//form.Show();
//form.Hide();
Thread t = new Thread(new ThreadStart(ShowForm2));
t.Start();
}
private void ShowForm2()
{
if (form.InvokeRequired)
{
Action a = new Action(ShowForm2);
form.Invoke(a);
}
else
{
form.Show();
Thread.Sleep(5000);
}
}
}
你能告诉我关于这个具体问题要改变什么吗?
【问题讨论】:
-
您需要一个已创建的 Form 实例。应该不难,如果你真的需要,请使用 Application.OpenForms[0]。
-
ShowView 是我的表单中的方法,它继承了 Form 类,所以我调用 show 方法来显示我的表单。我应该调用另一种方法来显示表单吗?
标签: c# winforms multithreading