using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 跨线程访问
{//跨线程指访问 
    public partial class Form1 : Form
    {
        private delegate void setTextValueCallBack(int x);
        setTextValueCallBack setCallBack;//先定义委托类型变量。
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            setCallBack = setTextValue;//给委托变量赋值一个方法
            Thread th = new Thread(textBox);//执行textBox方法
            th.IsBackground=true;//设置为后台线程。
            th.Start();
        }
       private void textBox()
        {
            for (int i = 0; i < 10000; i++)//textBox1的数值累加到9999
            {
                //setCallBack指向的是setTextValue方法。
                textBox1.Invoke(setCallBack,i);//访问textBox1用Invoke方法
             }
        }
        private void setTextValue(int value)
        {
            textBox1.Text = value.ToString();
        }
    }
}

  

TextBox1 的值循环在线程中累加到9999,运行结果。

 

 

补充:

简化写法:

 

        private void button1_Click(object sender, EventArgs e)
        {
            Thread th = new Thread(testMethod);//创建一个线程执行testMethod方法
            th.IsBackground = true;//设置为后台线程
            th.Start();//开启线程
        }
        void testMethod()
        {
            for (int i = 0; i < 10000; i++)
            {
               textBox1.Invoke(new Action<int>(n=>{
               textBox1.Text = n.ToString();}),i);//lambda表达试写法
            }
        }

  

 

posted on 2022-06-13 21:38  sbwynnss  阅读(159)  评论(0编辑  收藏  举报