委托的多线程方法BeginInvoke
同步方法和异步方法:
同步方法调用在程序继续执行之前需要等待同步方法执行完毕返回结果。(比如烧水泡茶,需要等水烧开了才能继续泡茶)
异步方法则在被调用之后立即返回以便程序在被调用方法完成其任务的同时执行其它操作。(比如烧水做饭,当水烧着的时候,还可以做饭)
定义一个下载的方法:
private void Download(string filename)
{
Console.WriteLine($"开始Download {filename}******当前线程:{Thread.CurrentThread.ManagedThreadId}");
Thread.Sleep(new Random().Next(, ) * );
Console.WriteLine($"Download {filename} 完成******当前线程:{Thread.CurrentThread.ManagedThreadId}");
}
使用同步方法调用:
Console.WriteLine($"下载开始*******当前线程:{Thread.CurrentThread.ManagedThreadId}");
for (int i = ; i < ; i++)
{
string file = "文件" + i;
this.Download(file);
}
Console.WriteLine($"下载结束*******当前线程:{Thread.CurrentThread.ManagedThreadId}");
输出结果:文件按顺序下载,所有的线程ID都是1

使用异步方法调用:
Console.WriteLine($"下载开始*******当前线程:{Thread.CurrentThread.ManagedThreadId}");
Action<string> action = this.Download;
for (int i = ; i < ; i++)
{
string file = "文件" + i;
action.BeginInvoke(file, null, null);
}
Console.WriteLine($"下载结束*******当前线程:{Thread.CurrentThread.ManagedThreadId}");
输出结果:文件下载顺序不固定,结束顺序不固定,每个下载都有自己的线程ID。

BeginInvoke 方法用于启动异步调用。它与需要异步执行的方法具有相同的参数,只不过还有两个额外的参数。
BeginInvoke 立即返回,不等待异步调用完成。
EndInvoke 方法用于检索异步调用结果。调用 BeginInvoke 后可随时调用 EndInvoke 方法;如果异步调用未完成,EndInvoke 将一直阻塞到
回调方法:
是通过将线程执行后,需要继续执行传入的方法。方法可以自定义。AsyncState为BeginInvoke 传入的第三个object参数。
Console.WriteLine($"下载大文件开始*******当前线程:{Thread.CurrentThread.ManagedThreadId}");
Action<string> action = this.Download;
string file = "流浪地球.MP4";
AsyncCallback asyncCallback = ar=> {
Console.WriteLine($"{ar.AsyncState}*******当前线程:{Thread.CurrentThread.ManagedThreadId}");
};
action.BeginInvoke(file, asyncCallback, "开始播放电影");
Console.WriteLine($"下载大文件结束*******当前线程:{Thread.CurrentThread.ManagedThreadId}");
调用结果:

BeginInvoke 返回值 IasyncResult
IsComplate 属性等待,通过判断可以知道线程是否已经执行完成。
Console.WriteLine($"下载大文件开始*******当前线程:{Thread.CurrentThread.ManagedThreadId}");
Action<string> action = this.Download;
string file = "流浪地球.MP4";
IAsyncResult asyncResult = null;
AsyncCallback asyncCallback = ar =>
{
Console.WriteLine($"{ar.AsyncState}*******当前线程:{Thread.CurrentThread.ManagedThreadId}");
};
asyncResult = action.BeginInvoke(file, asyncCallback, "开始播放电影");
int i = ;
while (!asyncResult.IsCompleted)
{
if (i <= )
{
Console.WriteLine($"下载了{i * 10}%");
}
else
{
Console.WriteLine($"下载了99.99%");
}
Thread.Sleep();
i++;
}
Console.WriteLine($"下载大文件结束*******当前线程:{Thread.CurrentThread.ManagedThreadId}");

WaitOne等待,即时等待 限时等待
asyncResult.AsyncWaitHandle.WaitOne();//直接等待任务完成
asyncResult.AsyncWaitHandle.WaitOne(-1);//一直等待任务完成
asyncResult.AsyncWaitHandle.WaitOne(5000);//最多等待5000ms,超时就不等了
EndInvoke 即时等待,而且可以获取委托的返回值 一个异步操作只能End一次
int iEndResult=action.EndInvoke(asyncResult);//等待某次异步调用操作结束,获取返回值
委托的多线程方法BeginInvoke的更多相关文章
- C#常用多线程方法
1. Thread类 C#多线程编程中Thread类需要包含名称空间System.Threading. class Program { static void Main(string[] args) ...
- 六种多线程方法解决UI线程堵塞
http://blog.csdn.net/oyi319/article/details/6851371 一.六种多线程方法 .NET Framework2.0框架提供了至少4种方式实现多线程,它们是& ...
- 委托异步调用时BeginInvoke的陷阱处理
这个陷阱来自于一个需求:需要异步在后台处理数据,处理完后触发处理完成的事件,大概是这么写的: EmployeeCollection data = new EmployeeCollection(): d ...
- 用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树
这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托,表达式树这些应用.今天我尝试用简单的方法叙述一下,让大家在五 ...
- 转帖:用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树
用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树 这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托 ...
- C# 匿名委托、匿名方法、匿名对象、Lambda表达式
一.匿名类型可通过使用 new 运算符和对象初始值创建匿名类型.示例:var v = new { Name = "Micro", Message = "Hello&quo ...
- C# 委托简单使用方法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 通过Func 委托理解委托和匿名方法及Lambda 表达式
Func<T, TResult> 委托 封装一个具有一个参数并返回 TResult 参数指定的类型值的方法. 命名空间: System 程序集: mscorlib(在 mscorlib.d ...
- c#-委托,匿名方法,lambda表达的关系
什么是委托: 包含单个方法的委托和函数指针是相似的,不同的是,委托是面向帝乡的并且是类型安全的 声明委托类型: delegate void mydel(int x); 声明委托和声明方法差不多,两个不 ...
随机推荐
- JAVA基础第四章-集合框架Collection篇
业内经常说的一句话是不要重复造轮子,但是有时候,只有自己造一个轮子了,才会深刻明白什么样的轮子适合山路,什么样的轮子适合平地! 我将会持续更新java基础知识,欢迎关注. 往期章节: JAVA基础第一 ...
- Android版数据结构与算法(五):LinkedHashMap核心源码彻底分析
版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 上一篇基于哈希表实现HashMap核心源码彻底分析 分析了HashMap的源码,主要分析了扩容机制,如果感兴趣的可以去看看,扩容机制那几行最难懂的 ...
- C#读写Excel的几种方法
1 使用Office自带的库 前提是本机须安装office才能运行,且不同的office版本之间可能会有兼容问题,从Nuget下载 Microsoft.Office.Interop.Excel 读写代 ...
- ACM入门之OJ~
所谓OJ,顾名思义Online Judge,一个用户提交的程序在Online Judge系统下执行时将受到比较严格的限制,包括运行时间限制,内存使用限制和安全限制等.用户程序执行的结果将被Online ...
- ASP.NET/MVC/Core的HTTP请求流程
ASP.NET HTTP管道(Pipeline)模型 1. 先讲一点,再深刻思考 一般我们都在写业务代码,优化页面,优化逻辑之间内徘徊.也许我们懂得HTTP,HTTPS的GET,POST,但是我们大部 ...
- CSS入门知识汇总
1.CSS认识 在谈论CSS的概念之前,我们先说一说web标准的目的——其在于创建一个统一的用于web表现层的技术标准,以便通过不同浏览器或终端设备向最终用户展示信息内容.一个网页的呈现是由三部分组成 ...
- SAP MM 巴西采购订单中的NCM Code
SAP MM 巴西采购订单中的NCM Code 1,近日收到业务部门报的一个问题,某用户试图将采购订单4400000071中ITEM 40的删除标记取消, SAP系统报错,'Enter a valid ...
- 将包含经纬度点位信息的Excel表格数据导入到ArcMap中并输出成shapefile
将包含经纬信息的Excel表格数据,导入到ArcMap中并输出成shapefile,再进行后面的操作.使用这种方法可以将每一个包含经纬信息的数据在ArcMap中点出来. 一.准备数据 新建Excel表 ...
- [ArcGIS API for JavaScript 4.8] Sample Code-Get Started-layers简介
[官方文档:https://developers.arcgis.com/javascript/latest/sample-code/intro-layers/index.html] 一.Intro t ...
- android---动画入门(一)
android 动画分为两类,View Animation(视图动画)和property Animation(属性动画),View Animation(视图动画)包含了Tween Animation和 ...