C# 委托于跨线程异步调用

子线程访问主线程控件时,会报出错。

两种方法可以实现第一种是,设置线程的检查方式为无。

第二种是使用委托。第一种没什么好讲的,这里主要讲下第二种。

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();
            }
        }

大功告成!

  

 

posted @ 2017-12-04 11:41  Restrain  阅读(6754)  评论(0编辑  收藏  举报