c#5.0(.net 4.5之后)的 Async+await+Task的异步机制的调试笔记
1.)无返回值的情况(异步也是基于线程).
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace ConfigLab.Test.BLL.AsyncTaskSpace
{
/// <summary>
/// 功能简介:测试无返回值,无需等待的async+await+task的异步处理机制。
/// 创建时间:2020-8-21
/// 创建人:pcw
/// 博客:http://cnblogs.com/taohuadaozhu
/// </summary>
public class Test1_Async_NotWait
{
public static void StartTest()
{
Utils.SaveLog($"Test1_Async_NotWait.StartTest.开始..{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")},线程:{Thread.CurrentThread.ManagedThreadId}");
AsyncTestMethod();
Utils.SaveLog($"Test1_Async_NotWait.StartTest.结束..{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")},线程:{Thread.CurrentThread.ManagedThreadId}");
}
/// <summary>
/// 异步方法
/// </summary>
/// <returns></returns>
static async Task AsyncTestMethod()
{
/*
注1:使用await表达式时,方法到这里之前先返回,等控制返回到调用此方法的线程中后,控制会自动返回到await关联语句下面的语句中。发生异常时,异常会在await表达式中抛出
注2: 使用Task.Run方式执行异步时,会在独立的线程中执行异步任务。
*/
Utils.SaveLog($"Test1_Async_NotWait.AsyncTestMethod.begin: await Task.Run,线程:{Thread.CurrentThread.ManagedThreadId}");
await Task.Run(() => {
for (int i = 0; i < 5; i++)
{
Thread.Sleep(200);
Utils.SaveLog($"Test1_Async_NotWait.AsyncTestMethod:{i},{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")},线程:{Thread.CurrentThread.ManagedThreadId}");
}
});
Utils.SaveLog($"Test1_Async_NotWait.AsyncTestMethod.after: await Task.Run,线程:{Thread.CurrentThread.ManagedThreadId}");
}
}
}
<执行结果>
[2020-08-21 00:41:33]Test1_Async_NotWait.StartTest.开始..2020-08-21 00:41:33 742,线程:1
[2020-08-21 00:41:33]Test1_Async_NotWait.AsyncTestMethod.begin: await Task.Run,线程:1
[2020-08-21 00:41:33]Test1_Async_NotWait.StartTest.结束..2020-08-21 00:41:33 815,线程:1
[2020-08-21 00:41:34]Test1_Async_NotWait.AsyncTestMethod:0,2020-08-21 00:41:34 017,线程:3
[2020-08-21 00:41:34]Test1_Async_NotWait.AsyncTestMethod:1,2020-08-21 00:41:34 219,线程:3
[2020-08-21 00:41:34]Test1_Async_NotWait.AsyncTestMethod:2,2020-08-21 00:41:34 422,线程:3
[2020-08-21 00:41:34]Test1_Async_NotWait.AsyncTestMethod:3,2020-08-21 00:41:34 624,线程:3
[2020-08-21 00:41:34]Test1_Async_NotWait.AsyncTestMethod:4,2020-08-21 00:41:34 827,线程:3
[2020-08-21 00:41:34]Test1_Async_NotWait.AsyncTestMethod.after: await Task.Run,线程:1
2.)有返回值的情况(异步也是基于线程).
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace ConfigLab.Test.BLL.AsyncTaskSpace
{
/// <summary>
/// 功能简介:测试有返回值,无需等待的async+await+task的异步处理机制。
/// 创建时间:2020-8-21
/// 创建人:pcw
/// 博客:http://cnblogs.com/taohuadaozhu
/// </summary>
public class Test3_Async_TaskWithReturn
{
public static void StartTest()
{
Utils.SaveLog($"Test3_Async_TaskWithReturn.StartTest.开始..{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")},线程:{Thread.CurrentThread.ManagedThreadId}");
getTestMethodReturnValue();
Utils.SaveLog($"Test3_Async_TaskWithReturn.StartTest.结束..{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")}");
}
static async void getTestMethodReturnValue()
{
Utils.SaveLog($"Test3_Async_TaskWithReturn.getTestMethodReturnValue.开始..{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")},线程:{Thread.CurrentThread.ManagedThreadId}");
var taskResult= AsyncTestMethod();
await taskResult;
//Utils.SaveLog($"Test3_Async_TaskWithReturn.StartTest.结束..{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")},异步任务返回结果:{(task.Status!=TaskStatus.WaitingForActivation? task.Result:"")}");
Utils.SaveLog($"Test3_Async_TaskWithReturn.getTestMethodReturnValue.结束..{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")},异步任务返回结果:{taskResult.Result},线程:{Thread.CurrentThread.ManagedThreadId}");
} /// <summary>
/// 异步方法
/// </summary>
/// <returns></returns>
static async Task<string> AsyncTestMethod()
{
/*
注1:使用await表达式时,控制会返回到调用此方法的线程中;在await等待的方法执行完毕后,控制会自动返回到下面的语句中。发生异常时,异常会在await表达式中抛出
注2: 使用Task.Run方式执行异步时,会在独立的线程中执行异步任务。
*/
Utils.SaveLog($"Test3_Async_TaskWithReturn.AsyncTestMethod..(await Task.Run之前),线程:{Thread.CurrentThread.ManagedThreadId}");
return await Task.Run(() => {
Thread.Sleep(2000);
Utils.SaveLog($"Test3_Async_TaskWithReturn.AsyncTestMethod(task.Run之中),{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")},线程:{Thread.CurrentThread.ManagedThreadId}");
return "success";
});
}
}
}
<执行结果>
[2020-08-21 00:41:35]Test3_Async_TaskWithReturn.StartTest.开始..2020-08-21 00:41:35 821,线程:1
[2020-08-21 00:41:35]Test3_Async_TaskWithReturn.getTestMethodReturnValue.开始..2020-08-21 00:41:35 824,线程:1
[2020-08-21 00:41:35]Test3_Async_TaskWithReturn.AsyncTestMethod..(await Task.Run之前),线程:1
[2020-08-21 00:41:35]Test3_Async_TaskWithReturn.StartTest.结束..2020-08-21 00:41:35 829
[2020-08-21 00:41:37]Test3_Async_TaskWithReturn.AsyncTestMethod(task.Run之中),2020-08-21 00:41:37 830,线程:3
[2020-08-21 00:41:37]Test3_Async_TaskWithReturn.getTestMethodReturnValue.结束..2020-08-21 00:41:37 834,异步任务返回结果:success,线程:1
最新文章
- 信贷业务(Ali)
- postgresql 9.2之前的版本 需要CREATE LANGUAGE plpgsql
- strcat、strcpy、memcpy 的使用注意
- 计算机网络(1)-----网络层IP协议概述
- Class to connect postgres with python in psycopg2
- ArcGIS Server 服务迁移、恢复
- auto_ptr的使用原则
- ActiveXObject Word.Application 打印小票
- Xcode 真机无法调试
- 通过PLSQL Developer导入SQL文件
- 最短路径算法Dijkstra和A*
- Linux 网络I/O模型
- 使用飞信api接口实现短信发送(只能发送好友)
- openGPS.cn - 高精度IP定位原理,定位误差说明
- 让 MyBatis Generator 变的更简单
- Stm32 GPIO复习
- 通过代码启动appium服务
- Treasure Hunting HDU - 3468
- javascript 错误监控
- Android超链接