前言

  微信群里的一个提问引发的这个问题,C#异步有多少种实现方式?首先想要知道C#异步有多少中实现方式,首先我们要知道.NET提供的执行异步操作的三种模式,然后再去了解C#异步实现的方式。

.NET异步编程模式

.NET 提供了执行异步操作的三种模式:

  • 基于任务的异步模式 (TAP) ,该模式使用单一方法表示异步操作的开始和完成。 TAP 是在 .NET Framework 4 中引入的。 这是在 .NET 中进行异步编程的推荐方法。 C# 中的 async 和 await 关键词以及 Visual Basic 中的 Async 和 Await 运算符为 TAP 添加了语言支持。 有关详细信息,请参阅基于任务的异步模式 (TAP)

  • 基于事件的异步模式 (EAP),是提供异步行为的基于事件的旧模型。 这种模式需要后缀为 Async 的方法,以及一个或多个事件、事件处理程序委托类型和 EventArg 派生类型。 EAP 是在 .NET Framework 2.0 中引入的。 建议新开发中不再使用这种模式。 有关详细信息,请参阅基于事件的异步模式 (EAP)

  • 异步编程模型 (APM) 模式(也称为 IAsyncResult 模式),这是使用 IAsyncResult 接口提供异步行为的旧模型。 在这种模式下,同步操作需要 Begin 和 End 方法(例如,BeginWrite 和 EndWrite以实现异步写入操作)。 不建议新的开发使用此模式。 有关详细信息,请参阅异步编程模型 (APM)

C#异步有四种实现方式

C# 异步有多种实现方式,可归纳为以下几类:

1、异步方法(Async Method TAP模式

使用 async/await 关键字实现异步编程,这是比较常用的一种方式。例如:

public async Task TestDoSomeAsync()
{
await Task.Delay(1000);
Console.WriteLine("Async method completed.");
}

2、任务并行库(TPL, Task Parallel Library TAP模式

通过 Task 和 Task<T> 类型实现异步编程,可以利用多核处理器,并发执行多个独立的任务。例如:

Task.Run(() =>
{
Console.WriteLine("Test Task 1 completed.");
}); Task.Run(() =>
{
Console.WriteLine("Test Task 2 completed.");
}); // 等待所有任务完成
Task.WaitAll();

3、Asynchronous Programming Model(APM模式)

这是一种比较古老的异步编程方式,需要手动创建回调函数,用于处理完成或错误的通知。例如:

public void DownloadFile(string url)
{
WebClient client = new WebClient(); // 定义异步操作完成后的回调函数
client.DownloadFileCompleted += (sender, e) =>
{
Console.WriteLine("Test Download completed.");
}; // 开始异步下载
client.DownloadFileAsync(new Uri(url), "file.txt");
}

4、Event-based Asynchronous Pattern(EAP模式)

这是一种已过时的异步编程模式,使用异步事件来实现异步编程。例如:

public class MyClass
{
public event EventHandler<EventArgs> MyEvent; public void DoSomething()
{
// 触发异步事件(注意:此处未使用异步操作)
MyEvent?.Invoke(this, EventArgs.Empty);
}
}

C#异步有多少种实现方式?的更多相关文章

  1. 算法——求n对()有多少种输出方式?

    letcode:22 Given n pairs of parentheses, write a function to generate all combinations of well-forme ...

  2. 面试题43:计算多少种译码方式(decode-ways)

    这道题是非常典型的DP问题.按照DP的套路,关键是讨论出递推表达式,遍历过程中针对当前字符是否为'0'以及前一个字符为'0',分类讨论得出到目前字符为止最多有多少种译码方式?理清了递推表达式,代码是很 ...

  3. SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论 SignalR 简单示例 通过三个DEMO学会SignalR的三种实现方式 SignalR推送框架两个项目永久连接通讯使用 SignalR 集线器简单实例2 用SignalR创建实时永久长连接异步网络应用程序

    SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论   异常汇总:http://www ...

  4. 同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式

    1. 概念理解        在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:   同步/异步主要针对C端: 同步:    ...

  5. How to make asynchronous HTTP requests in PHP 4种PHP异步执行的常用方式

    [是否等待返回就执行下一步] How to make asynchronous HTTP requests in PHP - Stack Overflow https://stackoverflow. ...

  6. 一只青蛙一次可以跳1阶或者2阶,n阶,有多少种到达终点的方式。

    前两天面试遇到的一个题,当时没有想清楚,今天想了一下,po出来: # -*-encoding:utf-8-*- import sys end = 0 # 终点 cnt = 0 # 统计组合方式 def ...

  7. HttpwebClient的四种请求方式

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷.      本文旨在发布代码,供自己参考,也供大家参考,谢谢. 正题: Ht ...

  8. iOS开发之UITableView中计时器的几种实现方式(NSTimer、DispatchSource、CADisplayLink)

    最近工作比较忙,但是还是出来更新博客了.今天博客中所涉及的内容并不复杂,都是一些平时常见的一些问题,通过这篇博客算是对UITableView中使用定时器的几种方式进行总结.本篇博客会给出在TableV ...

  9. 多线程深入:乐观锁与悲观锁以及乐观锁的一种实现方式-CAS(转)

    原文:https://www.cnblogs.com/qjjazry/p/6581568.html 首先介绍一些乐观锁与悲观锁: 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每 ...

  10. Java并发问题--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS

    首先介绍一些乐观锁与悲观锁: 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁.传统的关系型数据库里边就用到了很 ...

随机推荐

  1. 自行封装JDBCUtils

    自己封装JDBCUtils package com.javasm.util; import com.javasm.bean.Emp; import com.javasm.constants.JDBCC ...

  2. 在.NET中使用JWT

    1.配置文件添加 //jwt配置文件 "JWT": { "SigningKey": "14fa5f2rrwsg627fs256fdgff2r5rf52 ...

  3. Caused by: java.lang.ClassNotFoundException: Class org.openx.data.jsonserde.JsonSerDe not found

    Caused by: java.lang.ClassNotFoundException: Class org.openx.data.jsonserde.JsonSerDe not found 解决方法 ...

  4. 使用Jmeter进行https接口测试时,如何导入证书?

    转载:https://www.cnblogs.com/tester-zhangxiaona/p/12295473.html

  5. 一条随手的Arduino sketch优化 以Examples-02.Digital-Debounce为例

    1 const int buttonPin = 2; 2 const int ledPin = 13; 3 4 int ledState = HIGH; 5 int buttonState; 6 in ...

  6. c# form-data表单提交,post form上传数据、文件

    引用自:https://www.cnblogs.com/DoNetCShap/p/10696277.html 表单提交协议规定:要先将 HTTP 要求的 Content-Type 设为 multipa ...

  7. java生态下的后端开发都有哪些技术栈?

    前言 我08年毕业,那时(2003-2010)C#还比较时髦的,大学跟着老师进修的,毕业后就从事winform窗体应用程序开发.慢慢的web网站兴起,就转到aps.net开发,再到后来就上了另一艘船( ...

  8. jsp页面中的正则表达式--主要用于js判断文本格式

    一.方括号[] 举例: 二.^ 三.元字符 举例的话,就可以这么说,要实现要表示整数的话: []就表示输入的文本框里面的数字的第一位,可以这么写--->[1-9] 然后已知\d表示的与[0-9] ...

  9. Go 语言 new 和 make 关键字的区别

    原文链接: Go 语言 new 和 make 关键字的区别 本篇文章来介绍一道非常常见的面试题,到底有多常见呢?可能很多面试的开场白就是由此开始的.那就是 new 和 make 这两个内置函数的区别. ...

  10. 解决el-checked-group中v-medel绑定的是一个数组对象方法(不用修改源码)

    思路:弃用el-checked-group使用el-checked模拟 <!DOCTYPE html> <html> <head> <meta charset ...