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();
}
结果
创建
/第一种 无参数方式
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();
}
结果
相关文章推荐
- Android程序 类QQ通知常驻在Notification栏 点击Notification正确回调到之前已经放置在后台的Task中的对应Activity,而不是创建它的一个新实例
- 点击Notification正确回调到之前已经放置在后台的Task中的对应Activity,而不是创建它的一个新实例
- 网络编程(35)—— 利用pthread_join函数等待线程结束并获取线程函数返回值
- [AHK]创建WScript.Shell对象执行DOS命令行并获取返回值
- ThreadPool 线程池 多线程 等待 回调函数 获取返回值
- VB 创建可等待进程并获取Stdout输出的代码
- java创建HttpURLConnection连接并获取返回值
- 多线程创建、传参、共享数据、终止、等待、清除【转】
- 利用回调获取自拟定Dialog的返回值
- 基础篇:获取线程返回值与守护线程的创建(二)
- 【线程】多线程创建,传参,共享数据,终止,等待,清除
- Android程序 类QQ通知常驻在Notification栏 点击Notification正确回调到之前已经放置在后台的Task中的对应Activity,而不是创建它的一个新实例
- 使用Task类获取返回值
- FutureTask获取线程返回值
- JSF页面中使用js函数回调后台bean方法并获取返回值的方法
- Android程序 类QQ通知常驻在Notification栏 点击Notification正确回调到之前已经放置在后台的Task中的对应Activity,而不是创建它的一个新实例
- linux c 线程的创建与结束 (传参和返回值)
- uc笔记11---线程管理,线程函数:创建、等待、获取、比较、终止、取消, 线程属性
- 异步委托 多线程 多线程等待 多线程获取返回值
- springmvc拦截器 获取拦截方法的传参跟返回值