最近看了下多线程的委托传值。写代码时遇到一些问题。从网上找的文章代码打出来和我的问题一样。
下面是代码,麻烦朋友们帮忙看看。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 WindowsApplication2
{
    //声明一个回调函数:注意传递的参数要与Example类中的函数参数类型一致
    public delegate void ExampleCallback(int lineCount, Label lb);
    public partial class Form1 : Form
    {
                public Form1()
        {
            InitializeComponent();
        }
        public void CurrentNumber(int tempCurrent, Label lb)
        {
            try
            {
                lb.Text = tempCurrent.ToString();
            }
            catch (Exception ex)
            {
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            ThreadWithData twd = new ThreadWithData(1, 100, this.label1, new ExampleCallback(CurrentNumber));
            Thread td = new Thread(new ThreadStart(twd.RunMethod));
            td.Start();
        }        private void button2_Click(object sender, EventArgs e)
        {
            ThreadWithData twd = new ThreadWithData(2, 200, this.label2, new ExampleCallback(CurrentNumber));
            Thread td = new Thread(new ThreadStart(twd.RunMethod));
            td.Start();
        }
    }
    public class ThreadWithData
    {
        private int start = 0;
        private int end = 0;
        private ExampleCallback callBack;
        private Label lb;        public ThreadWithData(int start, int end, Label lb, ExampleCallback callBack)
        {
            this.start = start;
            this.end = end;
            this.callBack = callBack;
            this.lb = lb;
        }
        public void RunMethod()
        {
            for (int i = start; i < end; i++)
            {
                Thread.Sleep(1000);
                //if (callBack != null)
                    callBack(i, lb);
            }        }
    }
}

解决方案 »

  1.   

    不好意思代码有一点贴错了。这个是网上教程的代码,下面是完整的。运行后报错误——线程间操作无效: 从不是创建控件“label1”的线程访问它。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 WindowsApplication2
    {
        //声明一个回调函数:注意传递的参数要与Example类中的函数参数类型一致
        public delegate void ExampleCallback(int lineCount, Label lb);
        public partial class Form1 : Form
        {
                    public Form1()
            {
                InitializeComponent();
            }
            public void CurrentNumber(int tempCurrent, Label lb)
            {
                //try
                //{
                lb.Text = tempCurrent.ToString();
                //}
                //catch (Exception ex)
                //{
                //}
            }
            private void button1_Click(object sender, EventArgs e)
            {
                ThreadWithData twd = new ThreadWithData(1, 100, this.label1, new ExampleCallback(CurrentNumber));
                Thread td = new Thread(new ThreadStart(twd.RunMethod));
                td.Start();
            }        private void button2_Click(object sender, EventArgs e)
            {
                ThreadWithData twd = new ThreadWithData(2, 200, this.label2, new ExampleCallback(CurrentNumber));
                Thread td = new Thread(new ThreadStart(twd.RunMethod));
                td.Start();
            }
        }
        public class ThreadWithData
        {
            private int start = 0;
            private int end = 0;
            private ExampleCallback callBack;
            private Label lb;        public ThreadWithData(int start, int end, Label lb, ExampleCallback callBack)
            {
                this.start = start;
                this.end = end;
                this.callBack = callBack;
                this.lb = lb;
            }
            public void RunMethod()
            {
                for (int i = start; i < end; i++)
                {
                    Thread.Sleep(1000);
                    //if (callBack != null)
                        callBack(i, lb);
                }        }
        }
    }
      

  2.   

    你好,只是想了解一下多线程以及线程间的传值。加锁的问题稍后我会仔细了解。这里lock好像并不是导致这个错误的原因。麻烦看看3楼的代码。开始那个我加了个try给跳过了
      

  3.   

     很简单。public void CurrentNumber(int tempCurrent, Label lb)
            {
                if (lb.InvokeRequired)
                {
                    lb.Text = tempCurrent.ToString();
                }
                else
                {
                    lb.Invoke(new ExampleCallback(CurrentNumber), tempCurrent, lb);
                }
            }
      

  4.   

    public void CurrentNumber(int tempCurrent, Label lb)
            {
                if (!lb.InvokeRequired)
                {
                    lb.Text = tempCurrent.ToString();
                }
                else
                {
                    lb.Invoke(new ExampleCallback(CurrentNumber), tempCurrent, lb);
                }
            }
    不好意思 逻辑写错了. 下面这个才是对的
      

  5.   


    还没有试过,不过从今天最后看的一点资料看,else里的东西应该就是问题的关键了。
    这么说,是不是可以这么理解,我其实直接就可以使用Invoke而不用再进行判断?
    还是说这里有什么其它的说法?