关于C# 异步
关于C# 异步操作整理
按照个人的理解, 写一个接口用Task异步操作(态度:接受并且学习,您提出宝贵的经验与理解,我会认真学习):
在主线程中调用异步方法,如果主线程依赖异步方法的返回值那么你一定会去等待子线程的操作时间,但主线程可以继续处理自己的业务,增加了线程的利用率也增加了时间的利用率。(就像人们常说的忙里偷闲一样)
1.1如果一个项目 分层为:WebAPI(接口),Service(业务处理),Domain(基础操作),ORM。
WebAPI:处理, 接受请求,返回请求结果
Service :拼接操作+数据处理
Domain :基础业务 (增、删、改等)操作
ORM: dapper,EF,sqlSugar 等数据访问ORM 基本够用(封一下使用类)
1.2分析:
Service中 如果需要多次数据库操作时, 异步操作就会节省时间同时去请求数据库, 主线程不堵塞,可以1,2,3的发出请求操作,如果是同步,只能等待第一个出现结果,再去执行下一次操作。然后去等待他们的返回值,再去做一些数据处理加工。最终还是要去等待子的处理结果,假设他们都是相同方法,同步则需要消耗 *3的时间,异步则需要 <3的时间(理想状态,主线程也会节省部分时间)
2.以下就是一个小的DOME,并不是以上的结果,而是体现异步方法通道的重要性
重点:保证异步方法之间调用通道的通畅
class Program
{
//Main方法
static void Main(string[] args)
{
Console.WriteLine(">>>>>>>>>>>>>>>>主线程启动");
Task<string> task = GetStringAsync1();
Console.WriteLine("<<<<<<<<<<<<<<<<主线程结束");
Console.WriteLine($"GetStringAsync1执行结果:{task.Result}");
} #region 异步方法
static async Task<string> GetStringAsync1()
{
Console.WriteLine(">>>>>>>>GetStringAsync1方法启动");
string str = await GetStringAsync2();
Console.WriteLine("<<<<<<<<GetStringAsync1方法结束");
return str;
}
static async Task<string> GetStringAsync2()
{
Console.WriteLine(">>>>>>>>GetStringAsync2方法启动");
string str = await GetStringFromTask();
Console.WriteLine("<<<<<<<<GetStringAsync2方法结束");
return str;
}
static Task<string> GetStringFromTask()
{
Console.WriteLine(">>>>GetStringFromTask方法启动");
Task<string> task = new Task<string>(() =>
{
Console.WriteLine(">>任务线程启动");
Thread.Sleep(1000);
Console.WriteLine("<<任务线程结束");
return "hello world";
});
task.Start();
Console.WriteLine("<<<<GetStringFromTask方法结束");
return task;
}
#endregion
}
2.1结果:
2.2分析:
task.Result获取异步方法返回值 , await用于等待子线程结果,而主线程不会因为子线程开始而停止继续执行。
如果通道中出现 .result,则直接堵塞主线程。
3.假设:把代码调整 调用多个异步方法
//Main方法
static void Main(string[] args)
{
Console.WriteLine(">>>>>>>>>>>>>>>>主线程启动");
Task<string> task = GetStringAsync1();
Task<string> task1 = GetStringAsync1();
Task<string> task2 = GetStringAsync1();
Console.WriteLine("<<<<<<<<<<<<<<<<主线程结束");
Console.WriteLine($"GetStringAsync1执行结果:{task.Result}");
}
3.1结果:
3.2分析:
从整体运行时间上,就可以看出来不足3秒,也就2秒多一些,而且也可以看出 第二次调用第三次调用中等待1秒的操作,基本是同时执行完毕。
4.总结一下,在偷时间,充分利用主线程等待与多个子线程之间互不干涉的同时执行的形式。
注:本人也是查看许多大神的文章所理解整理的内容,如果有侵权请联系我(1054529695@qq.com),也欢迎大家查看。
关于C# 异步的更多相关文章
- 异步任务队列Celery在Django中的使用
前段时间在Django Web平台开发中,碰到一些请求执行的任务时间较长(几分钟),为了加快用户的响应时间,因此决定采用异步任务的方式在后台执行这些任务.在同事的指引下接触了Celery这个异步任务队 ...
- C#异步编程(一)
异步编程简介 前言 本人学习.Net两年有余,是第一次写博客,虽然写的很认真,当毕竟是第一次,肯定会有很多不足之处, 希望大家照顾照顾新人,有错误之处可以指出来,我会虚心接受的. 何谓异步 与同步相对 ...
- redux-amrc:用更少的代码发起异步 action
很多人说 Redux 代码多,开发效率低.其实 Redux 是可以灵活使用以及拓展的,经过充分定制的 Redux 其实写不了几行代码.今天先介绍一个很好用的 Redux 拓展-- redux-amrc ...
- C#与C++的发展历程第三 - C#5.0异步编程巅峰
系列文章目录 1. C#与C++的发展历程第一 - 由C#3.0起 2. C#与C++的发展历程第二 - C#4.0再接再厉 3. C#与C++的发展历程第三 - C#5.0异步编程的巅峰 C#5.0 ...
- 关于如何提高Web服务端并发效率的异步编程技术
最近我研究技术的一个重点是java的多线程开发,在我早期学习java的时候,很多书上把java的多线程开发标榜为简单易用,这个简单易用是以C语言作为参照的,不过我也没有使用过C语言开发过多线程,我只知 ...
- 异步编程 In .NET
概述 在之前写的一篇关于async和await的前世今生的文章之后,大家似乎在async和await提高网站处理能力方面还有一些疑问,博客园本身也做了不少的尝试.今天我们再来回答一下这个问题,同时我们 ...
- ajax异步请求
做前端开发的朋友对于ajax异步更新一定印象深刻,作为刚入坑的小白,今天就和大家一起聊聊关于ajax异步请求的那点事.既然是ajax就少不了jQuery的知识,推荐大家访问www.w3school.c ...
- 探索ASP.NET MVC5系列之~~~2.视图篇(上)---包含XSS防御和异步分部视图的处理
其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...
- C#异步编程(二)
async和await结构 序 前篇博客异步编程系列(一) 已经介绍了何谓异步编程,这篇主要介绍怎么实现异步编程,主要通过C#5.0引入的async/await来实现. BeginInvoke和End ...
- [.NET] 利用 async & await 的异步编程
利用 async & await 的异步编程 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/5922573.html 目录 异步编程的简介 异 ...
随机推荐
- Numpy Usage Introduction
Reference : http://my.oschina.net/u/175377/blog/74406 试验性的Numpy教程 原文来自Tentative NumPy Tutorial 目录 先决 ...
- [LeetCode]Word Break 特里
意甲冠军:推断字符串给定的字符串是否构成词典. 来推断目标字符串相匹配整个字典.我们需要来推断目标字符串的每个前缀开始的下一场比赛,这需要匹配目标字符串的成功,所有前缀的枚举. class TrieN ...
- LeetCode: Generate Parentheses [021]
[称号] Given n pairs of parentheses, write a function to generate all combinations of well-formed pare ...
- 图灵机(Turing Machine)
图灵机,又称图灵计算.图灵计算机,是由数学家阿兰·麦席森·图灵(1912-1954)提出的一种抽象计算模型,即将人们使用纸笔进行数学运算的过程进行抽象,由一个虚拟的机器替代人们进行数学运算. 所谓的图 ...
- codeforces Round #259(div2) D解决报告
D. Little Pony and Harmony Chest time limit per test 4 seconds memory limit per test 256 megabytes i ...
- Haroopad 安装到 Mac OSX
打开Terminal 控制台 粘贴运行代码安装换cask: ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/ ...
- 【Java】【Flume】Flume-NG阅读源代码AvroSink
org.apache.flume.sink.AvroSink是用来通过网络来数据传输的.能够将event发送到RPCserver(比方AvroSource),使用AvroSink和AvroSource ...
- INCORRECT PERMISSIONS ON /USR/LIB/PO1KIT-AGENT-HELPER-1(NEEDS TO BE SETUID ROOT)
INCORRECT PERMISSIONS ON /USR/LIB/PO1KIT-AGENT-HELPER-1(NEEDS TO BE SETUID ROOT) # sudo chmod +s /us ...
- WPF 遍历 控件
比较简单的方式是 在设计一个画面时 先添加一个grid 或其他的布局控件 确保要遍历的控件都在这个Grid中时就可以这么写 foreach (UIElement uie in Grid.Childre ...
- SEED缓冲区溢出实验笔记
缓冲区溢出实验(Linux 32位) 参考教程与材料:http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Software/Buffer_Overflow/ (本 ...