zoukankan      html  css  js  c++  java
  • 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();
                }
            }

    大功告成!

      

  • 相关阅读:
    C#磁吸屏幕窗体类库
    准备
    我写的诗
    How to turn off a laptop keyboard
    How to tell which commit a tag points to in Git?
    Why should I care about lightweight vs. annotated tags?
    How to get rid of “would clobber existing tag”
    Facebook, Google and Twitter threaten to leave Hong Kong over privacy law changes
    The need for legislative reform on secrecy orders
    Can a foreign key be NULL and/or duplicate?
  • 原文地址:https://www.cnblogs.com/kbqLibrary/p/7976372.html
Copyright © 2011-2022 走看看