设计视图和错误提示如图
代码如下
- C# code
using System;using System.Windows.Forms; using System.Threading;namespace SmartDeviceProject1{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 f1 = new Form2("1"); Thread th = new Thread(new ThreadStart(f1.DelayShow)); th.Start(); Form2 f2 = new Form2("2"); f2.ShowDialog(); } }}
- C# code
using System;using System.Windows.Forms;using System.Threading;namespace SmartDeviceProject1{ public partial class Form2 : Form { public Form2(string s) { InitializeComponent(); this.Text = s; } private void button1_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.Yes; } private void button2_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.No; } public void DelayShow() { Thread.Sleep(5000); this.ShowDialog(); } }}
小弟恳请高手不吝赐教,非常感谢!!
------解决方案--------------------
你这个DIALOG是在另一个线程当中展示出来的对吧。所以要用INVOKE或者BEGININVOKE来做,防止不同线程一起修改UI的情况发生。
------解决方案--------------------
http://topic.csdn.net/u/20090820/17/9fc79efc-a915-469f-8594-1fb117072502.html
------解决方案--------------------
首先,你的第一段程序有点儿绕,最好改一下,将线程代码做为一个单独的方法放在当前类中(Form1):
Form2 f1;
void threadshowform2(){
f1 = new Form2("1");
f1.DelayShow();
}
然后,将原来启动线程的代码改为:
Thread th = new Thread(new ThreadStart(threadshowform2));
th.Start();
Form2 f2 = new Form2("2");
f2.ShowDialog();
这样一改,逻辑关系就清晰多了。
现在说重点的,Form2的DelayShow()方法里,不能直接调用ShowDialog(),应该改用Invoke方式,大致格式是:
Invoke(new voidde(threadshow));
其中,voidde是托管方法,需要如下声明:
delegate void voidde();
threadshow()则是真正需要执行的代码,具体到这里,代码大概是:
void threadshow(){
this.ShowDialog();
}
至于之前的Thread.Sleep(5000),因其不涉及UI操作,故不需跨入UI线程,所以可以还留在原处,无需也一并移入被托管执行的代码中。