.Net 异步与同步

namespace demoSp;
class Program
{
static void Main(string[] args)
{
threadpl();
}
public static void threadpl()
{
Console.WriteLine("Async Test job:");
Console.WriteLine("main start..");
AsyncMethod();
Console.WriteLine("MyMethod()异步方法同步执行:");
DateTime startTime_1 = DateTime.Now;
var startThreadId_1 = Thread.CurrentThread.ManagedThreadId;
MyMethod().Wait(); //在main中等待async方法执行完成
DateTime endTime_1 = DateTime.Now;
var endThreadId_1 = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine($"startTime:{startTime_1.ToString("yyyy-MM-dd HH:mm:ss:fff")} startThreadId:{startThreadId_1}\nendTime:{endTime_1.ToString("yyyy-MM-dd HH:mm:ss:fff")} endThreadId:{endThreadId_1}");
Console.WriteLine("main end...");
DateTime startTime_2 = DateTime.Now;
var startThreadId_2 = Thread.CurrentThread.ManagedThreadId;
MyMethod().GetAwaiter().GetResult(); //用于在main中同步获取async方法的返回结果
DateTime endTime_2 = DateTime.Now;
var endThreadId_2 = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine($"startTime:{startTime_2.ToString("yyyy-MM-dd HH:mm:ss:fff")} startThreadId:{startThreadId_2}\nendTime:{endTime_2.ToString("yyyy-MM-dd HH:mm:ss:fff")} endThreadId:{endThreadId_2}");
Console.WriteLine("main end..");
Index();
IndexAsync().Wait();
Console.ReadKey(true);
}
static async Task MyMethod()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine("Async start:" + i.ToString() + "..");
await Task.Delay(1000); //模拟耗时操作
}
}
static async void AsyncMethod()
{
Console.WriteLine("start AsyncMethod1 async");
DateTime startTime = DateTime.Now;//进入DoSomething方法前的时间
var startThreadId = Thread.CurrentThread.ManagedThreadId;//进入DoSomething方法前的线程ID
await MyMethod();
Console.WriteLine("end AsyncMethod1 async");
DateTime endTime = DateTime.Now;//完成DoSomething方法的时间
var endThreadId = Thread.CurrentThread.ManagedThreadId;//完成DoSomething方法后的线程ID
Console.WriteLine($"AsyncMethod startTime:{startTime.ToString("yyyy-MM-dd HH:mm:ss:fff")} startThreadId:{startThreadId}\nendTime:{endTime.ToString("yyyy-MM-dd HH:mm:ss:fff")} endThreadId:{endThreadId}");
}
public static void Index()
{
DateTime startTime = DateTime.Now;//进入DoSomething方法前的时间
var startThreadId = Thread.CurrentThread.ManagedThreadId;//进入DoSomething方法前的线程ID
DoSomething();//耗时操作
DateTime endTime = DateTime.Now;//完成DoSomething方法的时间
var endThreadId = Thread.CurrentThread.ManagedThreadId;//完成DoSomething方法后的线程ID
Console.WriteLine($"startTime:{startTime.ToString("yyyy-MM-dd HH:mm:ss:fff")} startThreadId:{startThreadId}\nendTime:{endTime.ToString("yyyy-MM-dd HH:mm:ss:fff")} endThreadId:{endThreadId}");
}
/// <summary>
/// 耗时操作
/// </summary>
/// <returns></returns>
private static void DoSomething()
{
Thread.Sleep(3000);
}
public async static Task IndexAsync()
{
DateTime startTime = DateTime.Now;//进入DoSomething方法前的时间
var startThreadId = Thread.CurrentThread.ManagedThreadId;//进入DoSomething方法前的线程ID
await DoSomethingAsync();//耗时操作
DateTime endTime = DateTime.Now;//完成DoSomething方法的时间
var endThreadId = Thread.CurrentThread.ManagedThreadId;//完成DoSomething方法后的线程ID
Console.WriteLine($"astartTime:{startTime.ToString("yyyy-MM-dd HH:mm:ss:fff")} startThreadId:{startThreadId}\nendTime:{endTime.ToString("yyyy-MM-dd HH:mm:ss:fff")} endThreadId:{endThreadId}");
}
/// <summary>
/// 耗时操作 遇到 await 就会return ,线程就会退出,剩下的代码就会抛给另一个线程去执行
/// </summary>
private async static Task DoSomethingAsync()
{
await Task.Run(() => Thread.Sleep(3000));
}
}
var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
var task = Task.Factory.StartNew(() =>
{
token.ThrowIfCancellationRequested();
Console.WriteLine("Task started ");
Console.Read();
});
Console.WriteLine("Press 'Enter' key to cancel your task");
bool issigned = token.WaitHandle.WaitOne(5000);
tokenSource.Cancel();
Console.Read();
参考链接:
《.NET Web应用中为什么要使用async/await异步编程》 https://www.cnblogs.com/yanglang/p/13071091.html
《C# 多线程(18):一篇文章就理解async和await》 https://www.cnblogs.com/whuanle/p/12822705.html

浙公网安备 33010602011771号