您的位置:首页 > 其它

Task 创建 传参 等待 回调 获取返回值

2017-02-13 16:32 405 查看
创建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();
}

结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐