版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yuxuac/article/details/80436937
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
namespace TaskWaitTesting
{
class Program
{
private static Random R = new Random();
static void Main(string[] args)
{
TestWait();
//TestWaitAll(RetrieveTasks(10));
//TestWhenAll(RetrieveTasks(10));
//TestWaitAny(RetrieveTasks(10));
//TestWhenAny(RetrieveTasks(10));
// 主线程
while (true)
{
Console.WriteLine("Main thread is working...");
Thread.Sleep(2000);
}
}
private static void TestWait()
{
Console.WriteLine(string.Format("================{0}================", MethodBase.GetCurrentMethod().Name));
// Task with Action<object>
Task t1 = CreateATask(R.Next(1000, 10000));
t1.Wait();
// Task with Func<object>
Task<object> t2 = Task.Factory.StartNew<object>(s =>
{
Thread.Sleep(3000);
Console.WriteLine(s);
return s.ToString().Length;
},
"blabla");
Console.WriteLine("Length:" + t2.Result);
t2.Wait();
Console.WriteLine("Completed.");
}
private static void TestWaitAll(List<Task> tasks)
{
// WaitAll(): 所有任务完成之后,才会向下执行
Task.WaitAll(tasks.ToArray());
Console.WriteLine("WaitAll() is end.");
}
private static void TestWaitAny(List<Task> tasks)
{
// WaitAny(): 任何一个任务完成之后,就会向下执行
Task.WaitAny(tasks.ToArray());
Console.WriteLine("WaitAny() is end.");
}
private static void TestWhenAll(List<Task> tasks)
{
// WhenAll():所有任务都完成之后,指定要做的事,不阻塞当前线程。
// 此处的t1是一个额外的任务,与tasks无关
var t1 = Task.WhenAll(tasks).ContinueWith(tt =>
{
Console.WriteLine("WhenAll() Completed.");
});
}
private static void TestWhenAny(List<Task> tasks)
{
// WhenAny():任何一个任务都完成之后,指定要做的事,不阻塞当前线程。
// 此处的t1是一个额外的任务,与tasks无关
var t1 = Task.WhenAny(tasks).ContinueWith(tt =>
{
Console.WriteLine("WhenAny() Completed.");
});
}
/// <summary>
/// 取得任务List
/// </summary>
/// <param name="cnt"></param>
/// <returns></returns>
private static List<Task> RetrieveTasks(int cnt)
{
List<Task> tasks = new List<Task>();
for (int i = 0; i < cnt; i++)
{
tasks.Add(CreateATask(R.Next(1000, 10000)));
}
return tasks;
}
/// <summary>
/// 创建一个任务
/// </summary>
/// <param name="time"></param>
/// <returns></returns>
private static Task CreateATask(int time)
{
return Task.Factory.StartNew(input =>
{
Thread.Sleep(time);
Console.WriteLine("Thread:" + Thread.CurrentThread.ManagedThreadId + " Task:" + Task.CurrentId + " worked " + input.ToString() + " ms, now it ends.");
},
time);
}
/// <summary>
/// 创建一个有返回内容的任务(未使用)
/// </summary>
/// <param name="time"></param>
/// <returns></returns>
private static Task<object> CreateATaskWithReturn(int time)
{
return Task.Factory.StartNew<object>(input =>
{
Thread.Sleep(time);
Console.WriteLine("Thread:" + Thread.CurrentThread.ManagedThreadId + " Task:" + Task.CurrentId + " worked " + input.ToString() + " ms, now it ends.");
return Task.CurrentId.ToString();
},
time);
}
}
}