当前位置: 代码迷 >> Windows Mobile >> wm使用多线程的有关问题,PC上用则没有关问题,看了不少资料还是不懂
  详细解决方案

wm使用多线程的有关问题,PC上用则没有关问题,看了不少资料还是不懂

热度:923   发布时间:2016-04-25 08:06:01.0
wm使用多线程的问题,PC上用则没问题,看了不少资料还是不懂
设计视图和错误提示如图

代码如下
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线程,所以可以还留在原处,无需也一并移入被托管执行的代码中。
  相关解决方案