关于C# 异步操作整理

  1. 按照个人的理解, 写一个接口用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# 异步的更多相关文章

  1. 异步任务队列Celery在Django中的使用

    前段时间在Django Web平台开发中,碰到一些请求执行的任务时间较长(几分钟),为了加快用户的响应时间,因此决定采用异步任务的方式在后台执行这些任务.在同事的指引下接触了Celery这个异步任务队 ...

  2. C#异步编程(一)

    异步编程简介 前言 本人学习.Net两年有余,是第一次写博客,虽然写的很认真,当毕竟是第一次,肯定会有很多不足之处, 希望大家照顾照顾新人,有错误之处可以指出来,我会虚心接受的. 何谓异步 与同步相对 ...

  3. redux-amrc:用更少的代码发起异步 action

    很多人说 Redux 代码多,开发效率低.其实 Redux 是可以灵活使用以及拓展的,经过充分定制的 Redux 其实写不了几行代码.今天先介绍一个很好用的 Redux 拓展-- redux-amrc ...

  4. 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 ...

  5. 关于如何提高Web服务端并发效率的异步编程技术

    最近我研究技术的一个重点是java的多线程开发,在我早期学习java的时候,很多书上把java的多线程开发标榜为简单易用,这个简单易用是以C语言作为参照的,不过我也没有使用过C语言开发过多线程,我只知 ...

  6. 异步编程 In .NET

    概述 在之前写的一篇关于async和await的前世今生的文章之后,大家似乎在async和await提高网站处理能力方面还有一些疑问,博客园本身也做了不少的尝试.今天我们再来回答一下这个问题,同时我们 ...

  7. ajax异步请求

    做前端开发的朋友对于ajax异步更新一定印象深刻,作为刚入坑的小白,今天就和大家一起聊聊关于ajax异步请求的那点事.既然是ajax就少不了jQuery的知识,推荐大家访问www.w3school.c ...

  8. 探索ASP.NET MVC5系列之~~~2.视图篇(上)---包含XSS防御和异步分部视图的处理

    其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...

  9. C#异步编程(二)

    async和await结构 序 前篇博客异步编程系列(一) 已经介绍了何谓异步编程,这篇主要介绍怎么实现异步编程,主要通过C#5.0引入的async/await来实现. BeginInvoke和End ...

  10. [.NET] 利用 async & await 的异步编程

    利用 async & await 的异步编程 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/5922573.html  目录 异步编程的简介 异 ...

随机推荐

  1. 1-6 WebAPI基础和演示项目搭建

    启动项目的时候 在控制台用dotnet MsgService.dll的方式启动. 在program.cs文件下做如下修改: 实现在控制台 自定义ip和端口,修改之后有将项目重新生成,在控制台启动项目, ...

  2. C#中的String.Format介绍

    关键字:C# string.format作者:txw1958原文:http://www.cnblogs.com/txw1958/archive/2012/11/15/csharp-string_for ...

  3. 不积跬步无以至千里(C语言笔记)

    第一章 初始C程序     1.C程序结构         简单来说,一个C程序就是由头文件和函数组成         头文件             一条编译预处理命令:作用是在对C程序进行正式编译 ...

  4. linux process management

    CREAT PROCESS fork() | clone(參数,决定父子函数的共享内容) | do_fork() | copy_process() | dup_task_struct() 创建子进程的 ...

  5. BSD介绍

    BSD许可证模板  * Copyright (c) 1998, Regents of the University of California  * All rights reserved.    * ...

  6. 峰识别 峰面积计算 peak detection peak area 源代码 下载

    原文:峰识别 峰面积计算 peak detection peak area 源代码 下载 Comparative  analysis  of  peak-detection  techniques   ...

  7. JDBC学习笔记——增删改查

    1.数据库准备  要用JDBC操作数据库,第一步当然是建立数据表: ? 1 2 3 4 5 6 CREATE TABLE `user` (   `id` int(11) NOT NULL AUTO_I ...

  8. windows添加本地文件托管到新增github库

    新增repositoy.登录gitHub,并点击“New Reposoitory” 写入名字  之后点击“create resposity” \ 按照上图中的步骤可以完成.以下为完成步骤. 2. 在本 ...

  9. WPF Binding Path妙用

    <Window x:Class="XamlTest.Window9"        xmlns="http://schemas.microsoft.com/winf ...

  10. 漫谈 JVM —— 内存模型、线程、锁

    Java 内存模型(JMM),实际上的目的就是为了统一内存管理.这让我想到了,作为一个程序员总是想着有银弹,有一个代码能万能的在所有场景上.经过多次尝试我发现这是不可能的:需求在变,技术在更新,没有什 ...