同步方法和异步方法:

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

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

定义一个下载的方法:

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. python基于selenium实现自动删除qq空间留言板

    py大法好,让你解放双手. 脚本环境 python环境,selenium库,Chrome webdriver驱动等. 源码 # coding=utf-8 import datetime import ...

  2. asp.net core系列 47 Identity 自定义用户数据

    一.概述 接着上篇的WebAppIdentityDemo项目,将自定义用户数据添加到Identity DB,自定义扩展的用户数据类应继承IdentityUser类, 文件名为Areas / Ident ...

  3. 你需要知道的这几种 asp.net core 修改默认端口的方式

    一般情况下,aspnetcore发布后的默认端口是5000,这个大家都知道,而且默认骨架代码中没有看到任何让你输入的ip地址和端口号,但作为程序员的我们,不希望 被框架所管制,那如何实现默认端口的修改 ...

  4. HTML/CSS初步了解

    一.CSS是什么? 它是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言.CSS为HTML标记语言提供了一种样式描述,定义了其中元素的显示 ...

  5. 常见文本类css属性

    学习web的第六天 p{ font-size:18px;  /*文本尺寸*/ font-family:"隶书";  /*文本字体*/ font-weight:bold;    /* ...

  6. 学习 day4 html 盒子模型

    盒子模型 1.框模型 框:页面上所有元素都可以称为“框” 框模型:(BOX Model),又称盒子模型 定义框处理元素内容.内边距padding.外边距margin.边框的样式border 外边距ma ...

  7. Android-原笔迹手写的探索与开发

     前言 这篇文章主要是关于移动端原笔迹的开发,让平板上的手写效果达到笔迹光滑且有笔锋. 介绍关于原笔迹的算法思路. 项目github地址 算法思路分析 曲线拟合算法 利用曲线拟合算法增加虚拟的点,使得 ...

  8. 使用 FFT 进行频谱分析

    下面的示例说明了如何使用 FFT 函数进行频谱分析.FFT 的一个常用场景是确定一个时域噪声信号的频率分量. 首先创建一些数据.假设是以 1000 Hz 的频率对数据进行的采样.首先为数据构造一条时间 ...

  9. Agent Job代理 执行SSIS Package

    摘要: 在使用Agent Job时, 运行SSIS包的Run as账号,必须有SSIS中connection manager的连接权限. 如果没有连接权限,可以用创建proxy账号,并确保proxy账 ...

  10. 用ASP.NET Core 2.1 建立规范的 REST API -- 缓存和并发

    本文所需的一些预备知识可以看这里: http://www.cnblogs.com/cgzl/p/9010978.html 和 http://www.cnblogs.com/cgzl/p/9019314 ...