多线程小白:Task,Asycn与Await

今天重温了下Task,之前学的都还给课本了~~~~~

简单的代码如下,需要再看

两个示例的结果是一样的,只是用的不一样,感觉第一个更符合我的思维吧。但是相比第二个更好玩些

class Program
{
static void Main(string[] args)
{
/////在Task调用了.Wait()或.WaitAll()时,就证明你要开始漫长的等待了~
///不调用的时候,Task自己执行,你这块可以写些其他的代码
/*Exp1: action */
//List lstr = new List();
//Task[] tasks = new Task[3];
//Action GetTestIndex = ((index) => {
// Console.WriteLine("你好啊......." + index.ToString());
// lstr.Add(GetTest((int)index));
// Thread.Sleep((int)index);

//});
//for (int time = 0; time <3; time++)
//{
// Task task = new Task(GetTestIndex, time);
// tasks[time] = task;
// task.Start();
// Console.WriteLine("开启任务了。。。。");

//}
//Console.WriteLine("开始等待了....");
//Task.WaitAll(tasks);

//Console.WriteLine("任务执行完成了.....");
//foreach (var l in lstr)
//{
// Console.WriteLine("打印结果:"+ l);
//}

/*exp2: asycn 与 await*/
List lstr = new List();
Task[] tasks = new Task[5];
for (int i = 0; i < 5; i++)
{
tasks[i] = GetTask(i);
// tasks[i].Wait();
//tasks[i].Start(); //不能对已完成的任务调用 Start。
}

//获取最新完成的线程
List listRecord = new List();
int id = Task.CompletedTask.Id;
tasks.ToList().ForEach(x=> {
if (x.Id.Equals(id))
{
//刚完成的线程
Console.WriteLine("我是刚刚完成的线程+"+x.Result);
}
});
Console.WriteLine("、、、、其他的代码");

///其他代码 很好玩,每次的调用结果都是不同的。。异步
for (int i = 0;i<5;i++)
{
if (tasks[i].IsCompleted)
{
listRecord.Add(i);
Console.WriteLine("Hi,我执行完成了~"+i);
}
}
Console.WriteLine("开始等待线程的执行......");

Task.WaitAll(tasks);

Console.WriteLine("$##############等待等待完成.......");
tasks.ToList().ForEach(x=> {
Console.WriteLine(x.Result);
});
Console.WriteLine("执行完成....");

Console.ReadKey();

}
public static string GetTest(int index)
{
Console.WriteLine("执行我了..."+index.ToString());
Thread.Sleep(index);
return index.ToString();
}

//使用async 和await

protected static async Task GetTask(int index)
{
Console.WriteLine("哇塞开始执行了...." +index.ToString());
await Task.Run(()=> {
int i = 0;
while (i < 2000)
{
i++;
}
});
Console.WriteLine("等待线程的执行"+ index.ToString());
return "ok"+index.ToString();
}

 

 

 



}

你可能感兴趣的:(多线程小白:Task,Asycn与Await)