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

    大功告成!

      

  • 相关阅读:
    【POJ】3243 Clever Y
    【BZOJ】3916: [Baltic2014]friends
    【URAL】1960. Palindromes and Super Abilities
    【BZOJ】3621: 我想那还真是令人高兴啊
    【BZOJ】2286: [Sdoi2011消耗战
    【POJ】2891 Strange Way to Express Integers
    鬼畜的多项式
    【CF】438E. The Child and Binary Tree
    【BZOJ】3456: 城市规划
    【POJ】1811 Prime Test
  • 原文地址:https://www.cnblogs.com/kbqLibrary/p/7976372.html
Copyright © 2020-2023  润新知