创建Task并执行
创建
/第一种 无参数方式
TaskFactory taskfactory = new TaskFactory();
//第一种创建方式 无参数
for (int i = 0; i < 5; i++)
{
taskfactory.StartNew(new Action(() => {
Thread.Sleep(new Random().Next(0,1000));
Console.WriteLine("这里是Task第一种创建方式,线程ID为{0}",Thread.CurrentThread.ManagedThreadId);
}));
}
结果
//第一种 有参数
Console.WriteLine("***************程序开始 线程ID:{0}*******************",Thread.CurrentThread.ManagedThreadId);
TaskFactory taskfactory = new TaskFactory();
//第一种创建方式 有参数
for (int i = 0; i < 5; i++)
{
taskfactory.StartNew(new Action<object>(t => {
Thread.Sleep(new Random().Next(0,1000));
Console.WriteLine("这里是Task第一种创建方式,线程ID为{0},参数为:{1}",Thread.CurrentThread.ManagedThreadId,t);
}),i);
}
Console.WriteLine("***************程序结束 线程ID:{0}*******************", Thread.CurrentThread.ManagedThreadId);
结果:
Task.Run方式
for (int i = 0; i < 5; i++)
{
Task.Run(new Action(() => {
Thread.Sleep(new Random().Next(0,1000));
Console.WriteLine("这里是Task第一种创建方式,线程ID为{0}",Thread.CurrentThread.ManagedThreadId);
}));
}
等待
Console.WriteLine("***************程序开始 线程ID:{0}*******************",Thread.CurrentThread.ManagedThreadId);
TaskFactory taskfactory = new TaskFactory();
List<Task> taskList = new List<Task>();
//第一种创建方式 有参数
for (int i = 0; i < 5; i++)
{
taskList.Add(taskfactory.StartNew(new Action<object>(t =>
{
Thread.Sleep(new Random().Next(200, 5000));//这里只是为了让不同任务时间执行不同
Console.WriteLine("这里是Task第一种创建方式,线程ID为{0},参数为:{1}", Thread.CurrentThread.ManagedThreadId, t);
}), i));
}
//等待某一个
Task.WaitAny(taskList.ToArray());
Console.WriteLine("某一个执行完之后就执行这句话哦");
//等待所有
Task.WaitAll(taskList.ToArray());
Console.WriteLine("***************程序结束 线程ID:{0}*******************", Thread.CurrentThread.ManagedThreadId);
结果
回调
Console.WriteLine("***************程序开始 线程ID:{0}*******************",Thread.CurrentThread.ManagedThreadId);
TaskFactory taskfactory = new TaskFactory();
List<Task> taskList = new List<Task>();
//第一种创建方式 有参数
for (int i = 0; i < 5; i++)
{
taskList.Add(taskfactory.StartNew(new Action<object>(t =>
{
Thread.Sleep(new Random().Next(200, 5000));//这里只是为了让不同任务时间执行不同
Console.WriteLine("这里是Task第一种创建方式,线程ID为{0},参数为:{1}", Thread.CurrentThread.ManagedThreadId, t);
}), i));
}
//完成某一个 即执行回调
taskfactory.ContinueWhenAny(taskList.ToArray(), t => {
Console.WriteLine("执行完某一个之后立即执行的回调函数,参数值{0},执行是否结束{1}线程ID{2}",t.AsyncState,t.IsCompleted,Thread.CurrentThread.ManagedThreadId);
});
//所有都执行完之后 执行回调函数
taskfactory.ContinueWhenAll(taskList.ToArray(), t => {
foreach (Task item in t)
{
Console.WriteLine("回调函数 参数{0},是否执行完毕{1},线程ID{2}", item.AsyncState, item.IsCompleted, Thread.CurrentThread.ManagedThreadId);
}
});
Console.WriteLine("***************程序结束 线程ID:{0}*******************", Thread.CurrentThread.ManagedThreadId);
结果
获取返回值
获取返回值 我没想到太好的方法 只能通过外面包一层 来实现获取 以后有好多方法 再来更新
static void Main(string[] args)
{
try
{
Console.WriteLine("***************程序开始 线程ID:{0}*******************",Thread.CurrentThread.ManagedThreadId);
TaskFactory taskfactory = new TaskFactory();
List<Task> taskList = new List<Task>();
//第一种创建方式 有参数
for (int i = 0; i < 5; i++)
{
taskList.Add(taskfactory.StartNew(new Action<object>(t =>
{
string value=GetValue((int)t);
Thread.Sleep(new Random().Next(200, 1000));//这里只是为了让不同任务时间执行不同
Console.WriteLine("把方法包了一层 获取到返回值为{0}",value);
}), i));
}
Console.WriteLine("***************程序结束 线程ID:{0}*******************", Thread.CurrentThread.ManagedThreadId);
Console.Read();
}
catch (Exception ex)
{
throw;
}
}
public static string GetValue(int i)
{
return i.ToString();
}
结果