同步方法和异步方法:

同步方法调用在程序继续执行之前需要等待同步方法执行完毕返回结果。(比如烧水泡茶,需要等水烧开了才能继续泡茶)

异步方法则在被调用之后立即返回以便程序在被调用方法完成其任务的同时执行其它操作。(比如烧水做饭,当水烧着的时候,还可以做饭)

定义一个下载的方法:

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的更多相关文章

  1. C#常用多线程方法

    1.  Thread类 C#多线程编程中Thread类需要包含名称空间System.Threading. class Program { static void Main(string[] args) ...

  2. 六种多线程方法解决UI线程堵塞

    http://blog.csdn.net/oyi319/article/details/6851371 一.六种多线程方法 .NET Framework2.0框架提供了至少4种方式实现多线程,它们是& ...

  3. 委托异步调用时BeginInvoke的陷阱处理

    这个陷阱来自于一个需求:需要异步在后台处理数据,处理完后触发处理完成的事件,大概是这么写的: EmployeeCollection data = new EmployeeCollection(): d ...

  4. 用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树

    这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托,表达式树这些应用.今天我尝试用简单的方法叙述一下,让大家在五 ...

  5. 转帖:用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树

    用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树 这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托 ...

  6. C# 匿名委托、匿名方法、匿名对象、Lambda表达式

    一.匿名类型可通过使用 new 运算符和对象初始值创建匿名类型.示例:var v = new { Name = "Micro", Message = "Hello&quo ...

  7. C# 委托简单使用方法

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. 通过Func 委托理解委托和匿名方法及Lambda 表达式

    Func<T, TResult> 委托 封装一个具有一个参数并返回 TResult 参数指定的类型值的方法. 命名空间: System 程序集: mscorlib(在 mscorlib.d ...

  9. c#-委托,匿名方法,lambda表达的关系

    什么是委托: 包含单个方法的委托和函数指针是相似的,不同的是,委托是面向帝乡的并且是类型安全的 声明委托类型: delegate void mydel(int x); 声明委托和声明方法差不多,两个不 ...

随机推荐

  1. Gradle入门到实战(一) — 全面了解Gradle

    声明:本文来自汪磊的博客,转载请注明出处 可关注个人公众号,那里更新更及时,阅读体验更好:  友情提示由于文章是从个人公众号拷贝过来整理的,发现图片没有正常显示,没关注公众号的同学可通过如下链接查看: ...

  2. 从壹开始前后端分离【 .NETCore2.1 +Vue 2 +AOP+DI】框架之一 || 前言

    缘起 作为一个.Net攻城狮已经4年有余了,一直不温不火,正好近来项目不是很忙,闲得无聊,搞一搞新技术,一方面是打发无聊的时间,一方面也是督促自己该学习辣!身边的大神都转行的转行,加薪的加薪,本人比较 ...

  3. 约定Jenkins构建脚本

    对于Jenkins的使用,我感觉只用到其中一小部分功能,但也就是这一小部分功能,也推动了整个CI/CD的过程,Jenkins的使用方式有很多中,可能我用到的只是其中一种,但是已经满足我的需求,便不再贪 ...

  4. 使用LXD搭建Web网站

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由独木桥先生 发表于云+社区专栏 介绍 Linux的容器是Linux的一组进程,通过使用Linux内核功能与系统隔离.它是一个类似于虚拟 ...

  5. 从On-Premise本地到On-Cloud云上运维的演进

    摘要: 从用户的声音中,我们听到用户对稳定.弹性.透明的诉求,我们也在不断升级ECS的运维能力和体验,助力用户建立主动运维体系,赋能业务永续运行.为了让大家更好的了解和用好ECS弹性计算服务,从本期开 ...

  6. 六大设计原则(一)SRP单一职责原则

    单一职责原则SRP(Single reponsibility principle) BO(Business Object):业务对象 Biz(Business Logic):业务逻辑 SRP最简单的例 ...

  7. jquery实现照片墙

    jquery照片墙 由15张图片构成,大致思路:随机生成所有图片-->点击其中一张变为一张大图-->点击大图又变回多张 主要用到jquery实现 先来看看效果 html: <div ...

  8. 《OdooERP应用与开发基础》试读:第一章-Odoo概述

    文/开源智造联合创始人老杨 本文来自<OdooERP应用与开发基础>的试读章节.书籍尚未出版,请勿转载.欢迎您反馈阅读意见. Odoo是什么   Odoo,以前叫OpenERP,是比利时O ...

  9. iOS----------Mac维修预约-如何找到电脑维修单

    先打开苹果官网,找到技术支持 2.选择维修选项 3.查看维修状态 4.显示维修时间订单

  10. 一起学Android之Dialog

    概述 对话框(Dialog)是一个小窗口,在Android系统开发中经常会用到,它提示用户做决定或者输入一些东西,对话框并不填充屏幕,是一个模态(Modal)窗口.Dialog类是所有对话框的基类,应 ...