C#之初识异步
什么是异步
举个例子:小明的妈妈让小明烧一壶水,水烧开后要倒进水壶里,同时还需要把家里打扫一下.
小明的操作流程一:烧水---->等待至水烧开----->水倒进水壶里-------->打扫家务
小明的操作流程二:烧水----->打扫家务-------->等水烧开了就将水倒进水壶里-------->继续打扫家务.
第二种方式就是异步.
异步的使用
一.以委托方式调用异步
delegate void Write();
static void Main(string[] args)
{
Console.WriteLine("我是主线程");
Write write = new Write(new Program().WriteLine);
write.BeginInvoke(new Program().Judge, null);
Console.WriteLine("我还是是主线程");
Console.Read();
}
private void WriteLine() {
Console.WriteLine("开始计算1+1");
Thread.Sleep();
Console.WriteLine("结果是3!");
}
private void Judge(IAsyncResult async) {
Console.WriteLine("计算错误!");
}
运行结果
;其中WriteLine()是需要异步执行的方法,Judge()是异步执行完之后调用的方法,如果没有回调,则在执行委托时 将 new Program().Judge 改成null就行了.
二. async、await
异步方法需要用async关键字标记,但async标记的方法不一定是异步方法.
static void Main(string[] args)
{
Console.WriteLine("我是主线程1");
Task task =new Program(). Write1();
Console.WriteLine("我是主线程2");
Console.Read();
} private async Task Write1()
{
int po = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine(po);
Console.WriteLine("First async Run End");
}
运行结果,
,可以看到Write1()依然是在主线程中执行的.
await的使用限制:必须在有async标记的方法中使用.后面接的方法的返回值类型必须是Task或Task<T>..
static void Main(string[] args)
{
Console.WriteLine("我是主线程1");
Task task =new Program(). Write1();
Console.WriteLine("我是主线程2");
Console.Read();
} private async Task Write1()
{
await Write2();
int po = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine(po);
Console.WriteLine("First async Run End");
}
private async Task Write2()
{
Console.WriteLine("Hello World!");
await Write3();
for (int i = ; i < ; i++)
{
int po = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine(po);
Console.WriteLine("Working..{0}", i);
await Task.Delay(); //和Thread.Sleep(1000)效果一样.
}
} private async Task Write3() { for (int i = ; i < ; i++)
{
int po = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine(po);
Console.WriteLine("wirte3");
await Task.Delay();
}
}
运行结果
await表示的是await XX()之后的方法时异步的, XX()方法依然是在主线程中执行的,所以Write2()中的
Console.WriteLine("Hello World!")是在主线程中完成的,Write3()的第一次循环也是在主线程中完成的,然后第一次结束后有一个
await Task.Delay(1000);所以第二次循环是在异步线程中完成的.
C#之初识异步的更多相关文章
- Python并发编程之初识异步IO框架:asyncio 上篇(九)
大家好,并发编程 进入第九篇. 通过前两节的铺垫(关于协程的使用),今天我们终于可以来介绍我们整个系列的重点 -- asyncio. asyncio是Python 3.4版本引入的标准库,直接内置了对 ...
- 初识异步、并发处理纯代码及Demo
多线程Thread 处理 Thread thread = new Thread(()=> { ; i < ; i++) { Console.WriteLine("这是第" ...
- 我也来说说C#中的异步:async/await
序 最近看了一些园友们写的有关于异步的文章,受益匪浅,写这篇文章的目的是想把自己之前看到的文章做一个总结,同时也希望通过更加通俗易懂的语言让大家了解"异步"编程. 1:什么是异步 ...
- 《深入理解C#(第3版)》
<深入理解C#(第3版)> 基本信息 原书名:C# in depth 作者: (英)Jon Skeet 译者: 姚琪琳 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:978 ...
- PHP下的异步尝试二:初识协程
PHP下的异步尝试系列 如果你还不太了解PHP下的生成器,你可以根据下面目录翻阅 PHP下的异步尝试一:初识生成器 PHP下的异步尝试二:初识协程 PHP下的异步尝试三:协程的PHP版thunkify ...
- PHP下的异步尝试一:初识生成器
PHP下的异步尝试系列 PHP下的异步尝试一:初识生成器 PHP下的异步尝试二:初识协程 PHP下的异步尝试三:协程的PHP版thunkify自动执行器 PHP下的异步尝试四:PHP版的Promise ...
- .NET异步编程初识async与await
这是两个关键字,用于异步编程.我们传统的异步编程方式一般是Thread.ThreadPool.BeginXXX.EndXXX等等.把调用.回调分开来,代码的逻辑是有跳跃的,于是会导致思路不是很清晰的问 ...
- Springboot-async(异步)初识
通过@Async注解实现一个简单的异步任务处理 首先,假设一个全自动化的工厂车间每天需要开启四台互不影响的机器开关来完成生产量,于是车间主任A委派“同步甲”和“异步乙”轮 流完成每天打开机器开关的任务 ...
- AJAX异步、sweetalert、Cookie和Session初识
一.AJAX的异步示例 1. urls.py from django.conf.urls import url from apptest import views urlpatterns = [ ur ...
随机推荐
- python基础(28):isinstance、issubclass、type、反射
1. isinstance和issubclass 1.1 isinstance isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object): pa ...
- 为什么要做外链建设?seo优化与发布外链速度有哪些联系?
对于SEO员工来说,我们每天都在处理网页.从内容创建的角度来看,我们每天创建大量的URL并进入索引状态.与网站的受欢迎程度相比,网站每天也会生成大量的外部链接. 实际上,相对于链接而言,它满足了搜索引 ...
- MySQL学习——数据类型
MySQL学习——数据类型 摘要:本文主要学习了MySQL数据库的数据类型. 整数类型 MySQL主要提供的整数类型有tinyint.smallint.mediumint.int.bigint,其属性 ...
- Javase之集合体系(3)之Set及其子类知识
集合体系之Set及其子类知识 Set(接口) public interface Set<E>extends Collection<E> 特点:无序(存储顺序与取出顺序不一致 ...
- 重启电脑 wamp图标是橙色(未变绿)
记录一个错误: 修复系统漏洞后,重启电脑,wamp没有开机自启动,手动启动后发现,图标是大红色变成了橙色,也就是服务未完全启动(1/2)状态. ??? 但是我其实也不知道是哪个服务(Apache/My ...
- 文:你可以杀我,但你不能评价(judge)我
原创 豆瓣影评:“现代战争启示录”豆友影评 2006-12-18 20:24:20 本文刊载于<豆瓣影评>豆友“芹泽虾饺菌”的影评 原文标题<剃刀边缘的疯狂> 文/芹泽虾饺菌 ...
- Python requirements.txt
安装 pip install -r requirements.txt 生成 # 将当前环境下的所有以来导出, 配合虚拟环境更佳 pip freeze > requirements.txt
- 初学JavaScript正则表达式(十二)
text / exec方法 text() var reg1 = /\w/; var reg2 = /\w/g; reg1.test('a') === true reg2.test('a') === t ...
- python 给多人发送邮件,且将结果添加为附件
import unittest,HTMLTestRunnerimport osdef runa(): path=os.getcwd() print(path) a=unittest.defaultTe ...
- undefined reference to symbol 'dlclose@@GLIBC_2.2.5'
解决方法 在QT工程的.pro文件中添加如下内容: LIBS=-ldl