一、早餐的两种做法
1、串行做法
Console.WriteLine("*******************串行做早餐**********************");
{
var StartTime = DateTime.Now;
BeanPaddles cup = MakingBeanPaddles(3);
PrintMsg("豆浆做好了!");
Console.WriteLine("*****************************************");
Egg eggs = BoiledEgg(3);
PrintMsg("鸡蛋煮好了!");
Console.WriteLine("*****************************************");
YouTiao bacon = MarkingYouTiao(3);
PrintMsg("油条做好了");
Console.WriteLine("*****************************************");
var EndTime = DateTime.Now;
PrintMsg($"可以吃饭了,用时:{(EndTime - StartTime).TotalMilliseconds}ms!");
}
2、并行做法
Console.WriteLine("*******************火力全开做早餐**********************");
{
var StartTime = DateTime.Now;
Task[] tasks = new Task[] {
Task.Factory.StartNew(() => {
BeanPaddles cup = MakingBeanPaddles(3);
PrintMsg("豆浆做好了!");
}),
Task.Factory.StartNew(() => {
Egg eggs = BoiledEgg(3);
PrintMsg("鸡蛋煮好了!");
}),
Task.Factory.StartNew(() => {
YouTiao bacon = MarkingYouTiao(3);
PrintMsg("油条做好了");
})
};
await Task.Run(() => Task.WaitAll(tasks));
Console.WriteLine("*****************************************");
var EndTime = DateTime.Now;
PrintMsg($"可以吃饭了,用时:{(EndTime - StartTime).TotalMilliseconds}ms!");
}
3、效果对比
4、制作过程
private static YouTiao MarkingYouTiao(int slices)
{
PrintMsg("准备制作油条...");
Task.Delay(3000).Wait();
PrintMsg($"制做{slices}根油条");
Task.Delay(3000).Wait();
return new YouTiao();
}
private static Egg BoiledEgg(int howMany)
{
//
PrintMsg("煮鸡蛋...");
Task.Delay(3000).Wait();
PrintMsg($"煮{howMany}个鸡蛋");
Task.Delay(3000).Wait();
return new Egg();
}
private static BeanPaddles MakingBeanPaddles(int num)
{
PrintMsg("制作豆浆……");
Task.Delay(3000).Wait();
PrintMsg($"制做{num}L豆浆");
Task.Delay(3000).Wait();
return new BeanPaddles();
}
二、使用举例
1、效果
2、代码
var v = await GetUrlContentLengthAsync();
PrintMsg(v);
PrintMsg("123");
public static async Task<int> GetUrlContentLengthAsync()
{
var client = new HttpClient();
Task<string> getStringTask =
client.GetStringAsync("https://docs.microsoft.com/dotnet");
DoIndependentWork();
string contents = await getStringTask;
return contents.Length;
}
三、线程和任务的等待执行
private static void ThreadTest(int taskNum)
{
List<Thread> threads = new List<Thread>(taskNum);
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = 0; i < taskNum; i++)
{
int ii = i + 1;
Thread threadTest1 = new Thread(() =>
{
Thread.Sleep(2000);
Console.WriteLine("Thread {0}结束消耗时间:{1}", ii, watch.ElapsedMilliseconds);
});
threads.Add(threadTest1);
threadTest1.Start();
}
while (true)
{
if (threads.FindAll(t => t.IsAlive == true).Count == 0)
{
Console.WriteLine("监控Thread 结束消耗时间:{0}", watch.ElapsedMilliseconds);
break;
}
else
Thread.Sleep(1);
}
}
private static void TaskTest(int taskNum)
{
List<Task> tasks = new List<Task>(taskNum);
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = 0; i < taskNum; i++)
{
int ii = i + 1;
var Task1 = Task.Factory.StartNew(() =>
{
Thread.Sleep(2000);
if (ii>8&&ii%2==0)
{
throw new Exception("Mark Err:"+ii);
}
Console.WriteLine("Task {0}结束消耗时间:{1}", ii, watch.ElapsedMilliseconds);
});
Task1.ContinueWith(t =>
{
if (t.IsFaulted)
{
Console.WriteLine("任务异常退出:"+t.Exception?.InnerException.Message);
}
});
tasks.Add(Task1);
}
while (true)
{
if (tasks.FindAll(t => t.IsCompleted == false).Count == 0)
{
Console.WriteLine("监控 Task 结束消耗时间:{0}", watch.ElapsedMilliseconds);
break;
}
else
Thread.Sleep(1);
}
}