前言
实现方法的异步操作,掌握Task的基本用法。
实体类
class Student
{
public string name { get; set; }
public int age { get; set; }
}
方法
方法一:修改Student对象的name值,并返回success,用时2s。
public static String MyMethod(Student str)
{
str.name += " MyMethod";
Thread.Sleep(2000);
return "success";
}
方法二:给Student对象的age赋值,用时2s。
public static void MyMethod2(Student str)
{
str.age = 20;
Thread.Sleep(2000);
}
使用Task
public static void AsyncMethod2(Student str)
{
Console.WriteLine("开始异步代码" + DateTime.Now);
List<Task> tasks = new List<Task>();
Task<String> t1 = Task.Run(() => MyMethod(str));
Task t2 = Task.Run(() => MyMethod2(str));
tasks.Add(t1);
tasks.Add(t2);
// 等待两个线程都完成
Task.WaitAll(tasks.ToArray());
// 获取返回值
Console.WriteLine(t1.Result);
Console.WriteLine("异步代码结束" + DateTime.Now);
}
测试
static void Main(string[] args)
{
Console.WriteLine("主线程开始" + DateTime.Now);
Student s = new Student();
s.name = "小明";
AsyncMethod2(s);
Thread.Sleep(1000);
Console.WriteLine("主线程结束" + DateTime.Now + s.name + s.age);
Console.ReadLine();
}
结果:
主线程开始2018/12/11 14:05:40
开始异步代码2018/12/11 14:05:40
success
异步代码结束2018/12/11 14:05:42
主线程结束2018/12/11 14:05:43小明 MyMethod20
分析:两个方法各用时2s,使用多线程后2s就都完成操作,加上主线程的1s,总用时3s。达到多线程的效果。