一、概述

通过调用ThreadPool的QueueUserWorkItem方法来来启动工作者线程非常方便,但委托WaitCallback指向的是带有一个参数的无返回值的方法。

如果我们实际操作中需要有返回值,或者需要带有多个参数, 这时通过这样的方式就难以实现, 为了解决这样的问题,我们可以通过委托来建立工作者线程。

异步委托所执行的函数运行在线程池中,属于后台线程。

二、例子

 1 using System;
2 using System.Threading;
3
4 namespace DelegateBeginInvoke
5 {
6 class Program
7 {
8 delegate string MyDelegate(string str1, string str2);
9 static void Main(string[] args)
10 {
11 MyDelegate del = new MyDelegate(AsyncMethod);
12 string str1 = "123";
13 string str2 = "456";
14 IAsyncResult result = del.BeginInvoke(str1, str2,null, null);
15 Console.WriteLine("Delegate begininvoke called");
16 string myResult = del.EndInvoke(result);
17 Console.WriteLine($"Result is {myResult}");
18
19 }
20 private static string AsyncMethod(string str1, string str2)
21 {
22 PrintThreadInfo("Print info in AsyncMethod");
23 string myString = str1 + str2;
24 Thread.Sleep(6000);
25 return myString;
26 }
27 private static void PrintThreadInfo(string info)
28 {
29 Console.WriteLine(info);
30 Console.WriteLine($"ThreadId:{Thread.CurrentThread.ManagedThreadId}\nIsBackgroundThread:{Thread.CurrentThread.IsBackground}\nIsThreadPoolThread:{Thread.CurrentThread.IsThreadPoolThread}");
31 int workerThread = 0;
32 int ioThread = 0;
33 ThreadPool.GetMaxThreads(out workerThread, out ioThread);
34 Console.WriteLine($"MaxWorkerThread:{workerThread}\nMaxIoThread:{ioThread}");
35 int workerThreadAvailable = 0;
36 int ioThreadAvailable = 0;
37 ThreadPool.GetAvailableThreads(out workerThreadAvailable, out ioThreadAvailable);
38 Console.WriteLine($"AvailableWorkerThread:{workerThreadAvailable}\nAvailableIoThread:{ioThreadAvailable}");
39 }
40 }
41 }

运行结果如下:

注:EndInvoke会阻塞当前调用线程,直到工作者线程执行完毕,获得结果。

C#多线程---委托实现异步的更多相关文章

  1. .Net进阶系列(11)-异步多线程(委托BeginInvoke)(被替换)

    一. BeginInvoke最后两个参数的含义 倒数第二个参数:指该线程执行完毕后的回调函数:倒数第一个参数:可以向回调函数中传递参数. 下面以一段代码说明: /// <summary> ...

  2. C#用委托实现异步,异步与多线程的异同

    异步与多线程的区别(转) 一.异步和多线程有什么区别?其实,异步是目的,而多线程是实现这个目的的方法.异步是说,A发起一个操作后(一般都是比较耗时的操作,如果不耗时的操作就没有必要异步了),可以继续自 ...

  3. 异步和多线程,委托异步调用,Thread,ThreadPool,Task,Parallel,CancellationTokenSource

    1 进程-线程-多线程,同步和异步2 异步使用和回调3 异步参数4 异步等待5 异步返回值 5 多线程的特点:不卡主线程.速度快.无序性7 thread:线程等待,回调,前台线程/后台线程, 8 th ...

  4. C#委托实现异步

    BeginInvoke  开始调用 EndInvoke  结束调用 文章:C#编程总结(六)异步编程 文章:C#多线程实现方法——异步委托/调用 文章:你可能不知道的陷阱:C#委托和事件的困惑 一些委 ...

  5. c# 基于委托的异步编程模型(APM)测试用例

    很多时候,我们需要程序在执行某个操作完成时,我们能够知道,以便进行下一步操作. 但是在使用原生线程或者线程池进行异步编程,没有一个内建的机制让你知道操作什么时候完成,为了克服这些限制,基于委托的异步编 ...

  6. C#委托的异步调用1

    本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: /*添加的命名空间 u ...

  7. C#委托的异步调用

    本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: /*添加的命名空间 u ...

  8. c# 委托与异步调用

    背景:在winform UI中,有时需要对控件进行比较频繁的刷新,如进度条.picturebox显示视频等.如果在主线程进行这些刷新操作,操作还未完成就将执行下一次刷新,程序将发生错误:如果只是创建另 ...

  9. C#委托的异步调用【转】

    本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: ); //模拟该方法运 ...

随机推荐

  1. PYTHON 得到光标处的句柄

    import win32api import win32gui import time if __name__ == '__main__': while True: point = win32api. ...

  2. Java基础00-函数式接口33

    1. 函数式接口 1.1 函数式接口概述 代码示例: 定义一个接口: //次注解表示该接口为函数式接口,只能有一个抽象方法,如果有第二个就会报错. @FunctionalInterface publi ...

  3. 【LeetCode】242. 有效的字母异位词

    242. 有效的字母异位词 知识点:字符串:哈希表 题目描述 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 注意:若 s 和 t 中每个字符出现的次数都相同,则称  ...

  4. 5分钟搞定一个网页特效----v客学院技术分享

    这是我们v客学院基础班的童鞋都做完的一个超简单炫酷的特效demo,今天我来带大家用最快的速度和最简单的方法制作一个音乐抖动条,大家有兴趣不妨一起来试试~~~~~~~ 做这个demo之前我们得有一些ht ...

  5. 微信小程序云开发-数据库-用户更新数据并提交

    一.wxml增加input输入框和[更新商品价格]按钮 在商品详情页新增[更新商品价格]按钮,wxml新增部分代码,input绑定事件,用于获取用户输入的内容.按钮绑定事件,用于更新商品价格.  二. ...

  6. 开发工具IDE从入门到爱不释手(二)开发中必会技能

    一.高效的代码编辑技能 1.复制和复制历史 Ctrl+C:复制,点中你要复制的行,,完成复制 Ctrl+Shift+V:复制历史, 查看最近复制的五条历史记录 Ctrl+D:直接复制出光标所在行 Al ...

  7. Linux开机以root账户自动登录

    最近我们的自动化测试平台需要支持中标麒麟系统,对于我们来说要让这个系统支持分布式自动化测试,最重要的一点就是虚拟机启动后自动以root账户登录系统,并且执行我们的环境配置脚本,那么如何能让它开启自动登 ...

  8. Mplus 8.3 Combo Version for Win/Mac安装破解教程

    Mplus 8.3是一个统计建模程序,它为研究人员提供了一个灵活的工具来分析数据.本文提供其破解版安装包下载,亲测可永久免费使用,支持Windows 和 Mac操作系统. Mplus 8.3界面简单, ...

  9. Go语言基础知识总结(持续中)

    Go基础知识总结 变量声明 Go语言中的变量需要声明以后才可以使用(需要提前定义变量)并且声明后必须使用(不适用会报错) 标准声明 var 变量名 变量类型 example: var name str ...

  10. csredis-in-asp.net core理论实战-哨兵模式-使用示例

    csredis 开源地址 https://github.com/2881099/csredis 续上篇 csredis-in-asp.net core理论实战-主从配置.哨兵模式 示例源码 https ...