using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace TaskSample
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("我是主线程,线程ID:" + Thread.CurrentThread.ManagedThreadId);
//task用法一
Task task1 = new Task(() => MyAction());
task1.Start();
//task用法二
var strRes = Task.Run<string>(() => { return GetReturnStr(); });
Console.WriteLine(strRes.Result);
//task->async异步方法和await,主线程碰到await时会立即返回,继续以非阻塞形式执行主线程下面的逻辑
Console.WriteLine("---------------------------------");
Console.WriteLine("①我是主线程,线程ID:{0}", Thread.CurrentThread.ManagedThreadId);
var testResult = TestAsync();
Console.ReadKey();
}
static async Task TestAsync()
{
Console.WriteLine("②调用GetReturnResult()之前,线程ID:{0}。当前时间:{1}", Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString("yyyy-MM-dd hh:MM:ss"));
var name = GetReturnResult();
Console.WriteLine("④调用GetReturnResult()之后,线程ID:{0}。当前时间:{1}", Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString("yyyy-MM-dd hh:MM:ss"));
Console.WriteLine("⑥得到GetReturnResult()方法的结果一:{0}。当前时间:{1}", await name, DateTime.Now.ToString("yyyy-MM-dd hh:MM:ss"));
Console.WriteLine("⑥得到GetReturnResult()方法的结果二:{0}。当前时间:{1}", name.GetAwaiter().GetResult(), DateTime.Now.ToString("yyyy-MM-dd hh:MM:ss"));
}
static async Task<string> GetReturnResult()
{
Console.WriteLine("③执行Task.Run之前, 线程ID:{0}", Thread.CurrentThread.ManagedThreadId);
return await Task.Run(() =>
{
Thread.Sleep(2000);
Console.WriteLine("⑤GetReturnResult()方法里面线程ID: {0}", Thread.CurrentThread.ManagedThreadId);
return "我是返回值";
});
}
static void MyAction()
{
Console.WriteLine("我是新进程,线程ID:" + Thread.CurrentThread.ManagedThreadId);
}
static string GetReturnStr()
{
return "我是返回值,线程ID:" + Thread.CurrentThread.ManagedThreadId;
}
}
}C#中Task任务和Async、Await异步非阻塞方式
最新推荐文章于 2025-10-09 07:13:07 发布
本文介绍了C#中如何使用Task、Async和Await进行异步非阻塞操作。通过示例代码展示了Task的两种用法以及如何结合async和await实现主线程不被阻塞,详细解释了在异步方法中await关键字的作用,强调了在主线程中调用异步方法后,主线程会继续执行后续逻辑,而异步任务在后台线程中完成。
8927

被折叠的 条评论
为什么被折叠?



