当前位置: 代码迷 >> C# >> C#的多线程有关问题
  详细解决方案

C#的多线程有关问题

热度:198   发布时间:2016-04-28 08:43:35.0
C#的多线程问题
1、创建一个窗体1,在此窗体1中打开另一个窗体2,两个窗体是在一个线程中的嘛,还是各自运行在自己的线程中?
2、如1描述,若再在窗体2中创建一个新线程,此线程是独立与窗体2所在的线程运行的吗?
3一下代码为何运行不正确
            private void button1_Click(object sender, EventArgs e)
        {
            t1 = new Thread(new ThreadStart(ThreadFunc));
            t1.Start();
        }
        public void ThreadFunc()
        {
            MethodInvoker mi = new MethodInvoker(this.ShowMsgForm);
            this.BeginInvoke(mi);
        }
        public void ShowMsgForm()
        {
            while (true)
            {
                toolStripStatusLabel1.Text = System.DateTime.Now.ToString();
            }
        }
改成这样却能正常运行
                private void button1_Click(object sender, EventArgs e)
        {
            t1 = new Thread(new ThreadStart(ShowMsgForm));
            t1.Start();
        }
        public void ThreadFunc()
        {
            MethodInvoker mi = new MethodInvoker(this.ShowMsgForm);
            this.BeginInvoke(mi);
        }
        public void ShowMsgForm()
        {
            while (true)
            {
                toolStripStatusLabel1.Text = System.DateTime.Now.ToString();
            }
        }
只有红色部分不一样
------解决思路----------------------
对于第一个问题,你可以通过Thread.CurrentThread.ManagedThreadId来判断是否是同一个
第二个,新创建的线程是全新的
第三个,不知道,但按跨线程操作安全要求,你第二种写法也应该是错的啊
------解决思路----------------------
并不是所有的控件操作都要Invoke,有个InvokeRequired属性来判断的
你第一种写法等于在主线程上跑了死循环,应该改成
        private void button1_Click(object sender, EventArgs e)
        {
            t1 = new Thread(new ThreadStart(ThreadFunc));
            t1.Start();
        }
        public void ThreadFunc()
        {
             MethodInvoker mi = new MethodInvoker(this.ShowMsgForm);
            while (true)
            {
                    this.BeginInvoke(mi);
                    Thread.Sleep(0);
            }
        }
        public void ShowMsgForm()
        {
                toolStripStatusLabel1.Text = System.DateTime.Now.ToString();
        }
------解决思路----------------------
1、一个窗体上打开另一个窗体是在同一个主线程上,即UI线程
2、新建的线程是独立开辟出来的,和主线程不是一个;另外,调试时在vs左下角(我是vs2005)有显示当前运行程序所有的线程名称
3、如果跨线程的话,应该考虑用委托实现。附一个我最近应用的代码,我的mmtimer是自己写的类,与主线程不是同一线程,想
用主线程上的 textBox1控件显示数字,就利用委托,委托是用来保存一个(或多个)方法的指针

 private void FinalWork(string text)//先写一个方法函数,就是你最终要做的事
        {
            textBox1.Text = text;
        }
private void mmtimer1_Tick(object sender, EventArgs e)//然后是你的线程函数里
        {
            Action<string> action = new Action<string>(FinalWork);//创建委托,就是上面的FinalWork转换成Delegate类型
            double amp=0.009;
            string sss = amp.ToString();
            textBox1.Text = sss;
            object[] para = new object[] { sss }; //调用委托需要的参数,这里就1个ss
            this.Invoke(action, para);//用随便哪个控件的Invoke方法调用委托

        }
  相关解决方案