子线程访问主线程控件时,会报出错。
两种方法可以实现第一种是,设置线程的检查方式为无。
第二种是使用委托。第一种没什么好讲的,这里主要讲下第二种。
1,首先是委托
delegate
(1)委托的定义:将方法作为方法的参数
(2)定义委托:
delegate void dele(int a, int b);
委托是一种数据类型,就像 int , float,student 学生类一样
(3)声明委托变量
dele del1=null;
(4)给委托变量赋值
del=new dele(add); static void add(int a, int b) { Console.WriteLine("加法运算为{0}", a + b); }
(5)调用委托
del(2, 3);
全部代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 委托 { class Program { delegate void dele(int a, int b); static void Main(string[] args) { dele del = null; Console.WriteLine("多播委托,请输入您要的运算"); Console.WriteLine("+,-,*,/"); string str = Console.ReadLine(); switch (str) { case "+": del = new dele(add); break; case "-": del = new dele(sub); break; case "*": del = new dele(mul); break; case "/": del = new dele(div); break; default: Console.WriteLine("输入有误"); break; } weituo(3, 4, del); Console.ReadLine(); } static void weituo(int a,int b,dele del) { del(a, b); } static void add(int a, int b) { Console.WriteLine("加法运算为{0}", a + b); } static void sub(int a, int b) { Console.WriteLine("减法运算为{0}",a-b); } static void mul(int a, int b) { Console.WriteLine("乘法运算为{0}", a*b); } static void div(int a,int b) { Console.WriteLine("除法运算为{0}", a/b); } } }
2 跨线程调用委托
(1)定义类
public class MessageCreate{ }
(2)类中定义委托,定义委托变量,调用委托
public class MessageCreate { //定义委托 public delegate void MyDelegate(ListBox lb, string strMsg); //定义委托变量 public MyDelegate my { get;set; } //调用委托 public void show(ListBox lb, string strMsg){ if (lb.InvokeRequired)//判断这个控件是否是其他线程调用 lb.BeginInvoke(this.My, new object[] { lb, strMsg }); } }
(3)而给委托变量赋值时要在主线程里面赋值,那么这样一个异步调用委托就完成了。
//新建一个类 MessageCreate mc = new MessageCreate(); //给类中的委托变量赋值 mc.My = new MessageCreate.MyDelegate(ShowStatus); //调用委托 mc.show() ------------------委托函数-------------------------- public void ShowStatus(ListBox lb, string strMsg) { lock (lb) { if (lb.Items.Count >= 10000) lb.Items.RemoveAt(0); lb.Items.Add(strMsg); lb.Refresh(); } }
大功告成!