C# 委托于跨线程异步调用 |
您所在的位置:网站首页 › 主线程访问子线程变量 › C# 委托于跨线程异步调用 |
子线程访问主线程控件时,会报出错。 两种方法可以实现第一种是,设置线程的检查方式为无。 第二种是使用委托。第一种没什么好讲的,这里主要讲下第二种。 1,首先是委托 delegate (1)委托的定义:将方法作为方法的参数 (2)定义委托: delegate void dele(int a, int b);(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(); } }大功告成! |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |