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

大功告成!

  

时间: 2024-12-22 08:16:48

C# 委托于跨线程异步调用的相关文章

浅谈委托,事件,异步调用,回调等概率

直接说题. 委托         首先明确它是什么,其实就是一个类,定义一个委托即定义一个类,那么它是什么类?用来说明方法的类型的类.字段有类型,那么方法其实也有类型,就是委托.       委托是某一类方法的总定义.    事件           事件是某个类用于传递消息的方式.事件之余委托,犹如属性之余变量即是委托的封装.     好了,明确了概念,接下来说示例.    示例         有3个对象  鼠标,button,winform .鼠标点击button对象,触发button的c

Jmeter跨线程组调用token

终于搞定了Jmeter跨线程组之间传递参数,这样就不用每次发送请求B之前,都需要同时发送一下登录接口(因为同一个线程组下的请求是同时发送的),只需要发送一次登录请求,请求B直接用登录请求的参数即可,直到登录接口的参数失效了,需再次发送一次登录接口,又可以多次使用其参数,下面举例子: 1.登录接口中利用 Json Path Extractor 获取到登录接口的响应参数,(怎么获取上一节讲过) 响应结果是如下 2.在登录接口下添加 BeanShell PostProcessor ,并写入脚本如下:

jmeter 跨线程组调用变量

由于有些特殊需求需要在线程组之间调用变量,这里就总结一下几种常用方法(只是个人会的). 在使用时要注意线程组的执行顺序,需要勾选测试计划里的独立运行每个线程组按钮.还需要注意设置全局变量的后置处理器应该是在第一个线程组(即提取局部变量的那个线程组). 一.beanshell自带方法 props.put("变量名","值") 全局变量赋值 props.get("变量名") 获取全局变量 二.jmeter自带函数__setProperty ${__s

jmeter 正则获取多个返回token至本地文件,并跨线程组调用

1.打开jmeter,创建setup Thread Group对于setup Thread Group和tearDown Thread Group来说,从字面意思上来看就是安装线程组和卸载线程组,所以可以理解为对于线程组的初始化和完成时处理,setup Thread Group是所有我们真正开始线程并发之前的准备工作,必须是在线程组开始之前完成的并且拥有自己独立的线程设置. 2.添加HTTP信息投管理工具将接口需要的头信息放在这里 3.添加接口信息:setup Thread Group-->ad

线程异步调用实例

更新content时更新Lucene的索引 Content newContent = contentService.update(content);afterContentStatusChange(newContent, ContentStatusChangeThread.OPERATE_UPDATE); private void afterContentStatusChange(Content content, Short operate){ ContentStatusChangeThread

java 启用新线程异步调用

2秒后执行 某段代码: demo如下: System.out.println("正常执行...111"); Thread t = new Thread(){ public void run(){ try { sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } //2秒执行 System.out.println("2秒后 执行"); } }; t.start(); System.

C#中利用委托实现多线程跨线程操作

在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了保证线程安全以及提高代码的效率所做的改进,但是也给大家带来很多不便. 其实解决这个问题有两种方法:一,是通过设置System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;在你的程序初始化的时候设置了这个属性,而且在你的控件中使用的都是微软Framework类库中的控件的话,系统就不会再抛出你上面所说的

如何跨线程调用Windows窗体控件

通过一个子线程来操作主线程中的控件,但是,这样作会出现一个问题(如图1所示),就是TextBox控件是在主线程中创建的,在子线程中并没有对其进行创建,也就是从不是创建控件的线程访问它.那么,如何解决跨线程调用Windows窗体控件呢?可以用线程委托实现跨线程调用Windows窗体控件.下面将上一个例子进行一下改动.代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using Sys

c#中如何跨线程调用windows窗体控件?(from www.sysoft.cc)

我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题 首先来看传统方法: public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Thread thread = new Thread(ThreadFuntion); t