专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > Windows Mobile

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

发布时间:2010-05-30 01:01:25 文章来源:www.iduyao.cn 采编人员:星星草
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线程,所以可以还留在原处,无需也一并移入被托管执行的代码中。
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: