为了增强用户体验 我在一个winform项目中用到了多线程  
但是 不是很熟悉多线程  此前我一直做web开发的  
请大家看 private void button2_Click(object sender, EventArgs e)
        {            
            Thread t = new Thread(new ThreadStart(this.OutputThread));
            t.IsBackground = true;
            t.Start();            
        }      private void OutputThread()
        {
            //此处引用界面上的Control回报错  说不能跨线程访问这些东西 
            //  但是我这里需要用到很多Control  甚至是控制它们显示的值等等, 我该怎么办?
        }

解决方案 »

  1.   

    这是初学者最常见的问题,C#是现成安全的,而在线程内访问控件被视为非线程安全的,所以会报错,正确的做法是使用委托访问,这与C++里的多线程编程是一至的。看例子:using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;namespace WindowsApplication13
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
             private delegate void MoveLabel(int val);//声明代理
            Thread td;
            private void Form1_Load(object sender, EventArgs e)
            {
                td = new Thread(new ThreadStart(ThreadFun));
                td.Start();
            }
            void SetOffset(int val)
            {
                label1.Text = "从子线程里传入的值是:" + val.ToString();
            }
            private void ThreadFun()
            {
                if (this.InvokeRequired)
                {
                    MoveLabel d = new MoveLabel(SetOffset);
                    object[] arg = new object[] { 1 };//要传入的参数值
                    this.Invoke(d, arg);
                }
            }
        }
    }demo 下载:http://download.csdn.net/source/1584578
      

  2.   

    互斥啥啊?这个是由于UI线程(主线程中)创建的控件不允许在工作线程中使用(在.NET 1.1的时候是允许的)。工作线程里面不能访问UI组件,首先你要知道工作线程是干什么用的,UI线程的职责是什么?顾名思义:工作线程是用来干活的,UI线程是用来维护UI的。职责搞清楚了以后就好弄了,所以你的工作线程中不应该需要访问大量的UI组件,当你的工作线程需要通知UI变化时,你需要将这件事情交给UI线程来完成,通知UI线程即可(参考InvokeRequired属性以及Invoke方法)。如果工作线程中需要大量的访问UI线程考虑将这些工作交给UI线程来完成。
      

  3.   

    讲的不错,一般像大量数据库操作或很费时的计算,使用多线程来处理。这样部影响用户可以同时进行UI的输入或其他操作。。大量的UI操作方到线程做不太合理。。楼主看看是否可以划分下功能再考虑使用多线程