ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-01-02 12:33:42  阅读:171  来源: 互联网

标签:异步 lb 委托 C# del void int 线程 Console


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

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

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

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

大功告成!

标签:异步,lb,委托,C#,del,void,int,线程,Console
来源: https://blog.csdn.net/VisageNocturne/article/details/112094743

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有