几种异步操作方式
时间:2022-04-23
本文章向大家介绍几种异步操作方式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
其实这也是面试中被问倒的问题:(贴在这里纪念一下,注:只是简单的罗列,详细原理及分析,请参阅《CLR Via c#》第三版相关章节)
1、利用线程池发起异步操作
using System;
using System.Threading;
namespace Asynchronous
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("主线程:准备发起一系列异步操作...");
ThreadPool.QueueUserWorkItem(ComputeBoundOp, 5);
ThreadPool.QueueUserWorkItem(ComputeBoundOp, 7);
Console.WriteLine("主线程:干其它事情...");
Thread.Sleep(1000);
Console.WriteLine("按回车退出...");
Console.ReadLine();
}
private static void ComputeBoundOp(object o)
{
Console.WriteLine("异步操作回调:state={0}", o);
Thread.Sleep(1000);
}
}
}
结果:
或
2、利用Threading.Tasks中的Task
using System;
using System.Threading;
using System.Threading.Tasks;
namespace Asynchronous
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("主线程:准备发起一系列异步操作...");
Task t = new Task(ComputeBoundOp,5);
t.Start();
Console.WriteLine("主线程:干其它事情...");
Thread.Sleep(1000);
Console.WriteLine("按回车退出...");
Console.ReadLine();
}
private static void ComputeBoundOp(object o)
{
Console.WriteLine("异步操作回调:state={0}", o);
Thread.Sleep(1000);
}
}
}
3、利用System.Threading.Timer
using System;
using System.Threading;
namespace Asynchronous
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("主线程:准备发起一系列异步操作...");
Timer t = new Timer(ComputeBoundOp, 5, 50, 0);
Console.WriteLine("主线程:干其它事情...");
Thread.Sleep(1000);
Console.WriteLine("按回车退出...");
Console.ReadLine();
}
private static void ComputeBoundOp(object o)
{
Console.WriteLine("异步操作回调:state={0}", o);
Thread.Sleep(1000);
}
}
}
4、利用APM(Asynchronous Programming Model)中的beginXXX方法
using System;
using System.Threading;
namespace Asynchronous
{
class Program
{
delegate void MyDelegate(object o);
static void Main(string[] args)
{
Console.WriteLine("主线程:准备发起一系列异步操作...");
MyDelegate mydelegate = ComputeBoundOp;
mydelegate.BeginInvoke(null,ComputeBoundOpCallBack,5);
Console.WriteLine("主线程:干其它事情...");
Thread.Sleep(5000);
Console.WriteLine("按回车退出...");
Console.ReadLine();
}
private static void ComputeBoundOp(object o)
{
Thread.Sleep(1000);//模拟异步操作在做一些耗时的操作
}
private static void ComputeBoundOpCallBack(IAsyncResult ar)
{
Console.WriteLine("异步操作的回调:{0}" , ar.AsyncState);
}
}
}
未完待续...
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Hystrix服务降级-服务熔断
- 自定义值类型一定不要忘了重写Equals,否则性能和空间双双堪忧
- brk实现
- MapReduce之WritableComparable排序
- MapReduce之Combiner合并
- 05 Spring Boot 整合Spring Security
- 无分类编址 CIDR(构造超网)
- Spring Boot 集成 Mybatis 多数据源配置后出现 Invalid bound statement (not found)
- 解决VM虚拟机页面显示不正常的问题
- 热力图与原始图像融合
- 清华大佬教你用一篇文章完全学会Git,GitHub,Git Server
- 《闲扯Redis九》Redis五种数据类型之Set型
- 【每日一题】28. Implement strStr()
- 小程序组件开发 -- 疫情动态
- 超干货!为了让你彻底弄懂MySQL事务日志,我通宵肝出了这份图解!