哈尔滨地区企业如何外包电子商务网站建设及备案流程?
摘要:电子商务网站建设备案须知,哈尔滨网站建设方案外包,人才招聘网网站策划方案,网站策划编辑的职责文章目录 前言Task返回值无参返回有参返回 async和await返回值await搭配使用Main async改造 Task进阶Task线程取消测
电子商务网站建设备案须知,哈尔滨网站建设方案外包,人才招聘网网站策划方案,网站策划编辑的职责文章目录 前言Task返回值无参返回有参返回 async和await返回值await搭配使用Main async改造 Task进阶Task线程取消测试用例超时设置 线程暂停和继续测试用例 多任务等最快多任务全等待 结论 前言
Task是对于Thread的封装#xff0c;是极其优化的设计#xff0c;更加方便了我… 文章目录 前言Task返回值无参返回有参返回 async和await返回值await搭配使用Main async改造 Task进阶Task线程取消测试用例超时设置 线程暂停和继续测试用例 多任务等最快多任务全等待 结论 前言
Task是对于Thread的封装是极其优化的设计更加方便了我们如何操控线程
Task
Task声明形如
public static Task Sleep()
{}Task是一种类型
返回值
直接声明Task是需要返回值的。
无参返回
public static Task Sleep(int second)
{return Task.CompletedTask;
}
有参返回 public static TaskT Sleep(){return Task.FromResult(T);}
//举例返回参数只能唯一除非使用元祖public static Taskstring Sleep(){return Task.FromResult(Hello world!);}
使用Task.Result获取返回值 var res Sleep().Result;async和await
async和await是对于异步事件的控制方便我们对异步事件的操控。
返回值
使用async之后可以直接设置返回值
///有参返回public static async Taskstring Sleep(){return Hello world;}///无参返回public static async Task Sleep(){}await搭配使用
异步事件的等待使用await方法 public static async Task Sleep(int second){await Task.Delay(second * 1000);Console.WriteLine($等待{second}s);}static void Main(string[] args){Sleep(3);Sleep(2);Sleep(1);Console.WriteLine(运行完毕);//使用键盘键入事件阻塞主进程主进程结束程序会立即退出Console.ReadKey();}打印结果
打印结果显示
同步事件先结束异步事件互相不阻塞3,2,1同时开始等待3,2,1s打印1,2,3。
Main async改造
主程序是Void无法等待 将Void改成Task即可等待异步事件 打印结果服务预期等待异步事件结束后运行
Task进阶
C#Task取消任务执行CancellationTokenSource C# Task 暂停与取消
Task线程取消
以前Thread有Abort()方法强行销毁线程但是这个方法用于极大的安全问题已经被弃用。 线程不能直接被销毁只能通过抛出异常来取消线程。
//声明token
var tokenSource new CancellationTokenSource();
//注册异常抛出
tokenSource.Token.ThrowIfCancellationRequested();
//注册取消事件回调
tokenSource.Token.Register(()
{Console.WriteLine(线程已被取消);
});。。。。。。别的地方的代码
//取消token那么之前写ThrowIfCancellationRequested的地方会直接结束
tokenSource.Cancel();
测试用例
一个简单的死循环函数运行时返回token用于直接跳出程序
static async Task Main(string[] args)
{var token Loop();//等待3s抛出异常await Task.Delay(1000 * 3);Console.WriteLine(任务完成);token.Cancel();Console.ReadKey();}/// summary
/// 循环等待
/// /summary
/// returns/returns
public static CancellationTokenSource Loop()
{var tokenSource new CancellationTokenSource();Console.WriteLine(任务开始);tokenSource.Token.Register(() {Console.WriteLine(线程已被取消);});var count 0;Task.Run(async () {while (true){await Task.Delay(1000);//抛出异常直接结束线程tokenSource.Token.ThrowIfCancellationRequested();count;Console.WriteLine(count);}});return tokenSource;
}打印结果 这样使用起来也更加安全。
超时设置
tokenSource.CancelAfter是超时方法。 CancelAfter(1000:1000毫秒后超时 static async Task Main(string[] args){var token Loop();///3000毫秒后取消token.CancelAfter(1000*3);Console.ReadKey();}/// summary/// 循环等待/// /summary/// returns/returnspublic static CancellationTokenSource Loop(){var tokenSource new CancellationTokenSource();Console.WriteLine(任务开始);tokenSource.Token.Register(() {Console.WriteLine(线程已被取消);});var count 0;Task.Run(async () {while (true){await Task.Delay(1000);tokenSource.Token.ThrowIfCancellationRequested();count;Console.WriteLine(count);}});return tokenSource;}线程暂停和继续
线程暂停也是使用一个类去控制ManualResetEvent。和线程销毁一样是不能直接暂停的因为直接暂停也不安全。
//声明false为默认阻塞true为不阻塞
var resetEvent new ManualResetEvent(false);
//暂停通过WaitOne方法来阻塞线程通过Set和Reset来设置是否阻塞
resetEvent.WaitOne();
//阻塞暂停
resetEvent.Set()
//取消阻塞继续
resetEvent.Reset()
测试用例 static async Task Main(string[] args){var canStop CanStop();//等待3s抛出异常Console.WriteLine(等待3s启动);await Task.Delay(1000 * 3);Console.WriteLine(启动);canStop.Set();Console.WriteLine(等待3s暂停);await Task.Delay(3000);Console.WriteLine(暂停!);canStop.Reset();Console.ReadKey();}public static ManualResetEvent CanStop(){var resetEvent new ManualResetEvent(false);var count 0;Task.Run(async () {while (true){resetEvent.WaitOne();await Task.Delay(1000);count;Console.WriteLine(count);}});return resetEvent;}
多任务等最快
await Task.WhenAny(Task1,Task2,Task3) 只会等待最快的一个。 static async Task Main(string[] args){await Task.WhenAny(Sleep(1),Sleep(2),Sleep(3));Console.WriteLine(运行结束);Console.ReadKey();}public async static Task Sleep(int second){await Task.Delay(second*1000);Console.WriteLine($等待{second}s);}
运行结果 多任务全等待 static async Task Main(string[] args){await Task.WhenAll(Sleep(1), Sleep(2), Sleep(3));Console.WriteLine(运行结束);Console.ReadKey();}public async static Task Sleep(int second){await Task.Delay(second*1000);Console.WriteLine($等待{second}s);}结论
异步线程的控制是极其重要的内容Task还可以和委托一起使用对程序的运行有更强的把控力。
