.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
作者:androllen
出处:https://www.cnblogs.com/androllen/p/18746671
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义