class Program
{
//创建Task任务的三种方式(无返回值)
static void Main(string[] args)
{
//方法一
Task task1 = new Task(() =>
{
Console.WriteLine("方法一异步任务");
Thread.Sleep(2000); });
task1.Start();
Task.WaitAll(task1);
//方法二
Task.Run(() =>
{
Console.WriteLine("方法二异步任务");
});
//方法三
Task.Factory.StartNew(() =>
{
Console.WriteLine("方法三:通过工厂创建异步任务对象");
});
Console.ReadLine();
}
}
        //创建Task任务的三种方式(无返回值)
static void Main(string[] args)
{
var t1 = new Task(() => TaskMethod("task1"));
var t2 = new Task(() => TaskMethod("task2"));
t1.Start();
t2.Start();
Task.WaitAll(t1, t2);
Task.Run(() => TaskMethod("task3"));
Task.Factory.StartNew(() => TaskMethod("task4"));
Task.Factory.StartNew(() => TaskMethod("task5"), TaskCreationOptions.LongRunning);
Console.WriteLine("主线程开始执行任务");
Task task = new Task(() =>
{
Console.WriteLine("使用System.Threading.Tasks.Task执行异步操作.");
for (int i = ; i < ; i++)
{
Console.WriteLine(i);
}
});
task.Start();
Console.WriteLine("主线程执行其他任务");
task.Wait(); Console.ReadLine();
}
static void TaskMethod(string taskName)
{
Console.WriteLine($"任务名称:{taskName},线程Id:{Thread.CurrentThread.ManagedThreadId},是否为线程池执行:{Thread.CurrentThread.IsThreadPoolThread}");
}
        /// <summary>
/// 带返回值的Task<int>案例代码
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
TaskMethod("main task");
Task<int> task = CreateTask("task1");
task.Start();
int result = task.Result;
Console.WriteLine("task1 result is :" + result); task =CreateTask("task2");
task.RunSynchronously();//在当前主线程中同步执行task
result = task.Result;
Console.WriteLine("task2 result is :" + result); task = CreateTask("task3");
Console.WriteLine(task.Status);
task.Start();
while (!task.IsCompleted)
{
Console.WriteLine(task.Status);
Thread.Sleep();
} //常规使用方法
task = new Task<int>(() => Getsum());
task.Start();
Console.WriteLine("主线程执行其他任务");
task.Wait();
Console.WriteLine("获取task执行结果" + task.Result.ToString());
Console.ReadLine(); }
static Task<int> CreateTask(string name)
{
return new Task<int>(() => TaskMethod(name));
}
static int TaskMethod(string name)
{
Console.WriteLine("Task {0} is running on a thread id {1}. Is thread pool thread: {2}",
name, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);
Thread.Sleep(TimeSpan.FromSeconds());
return ;
}
static int Getsum()
{
int sum = ;
Console.WriteLine("使用Task执行异步操作.");
for (int i = ; i < ; i++)
{
sum += i;
}
return sum;
}
        /// <summary>
/// async/await实现带返回值task
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{ Task<int> task = AsyncMethod();
Console.WriteLine("主线程执行其他处理,线程id:"+Thread.CurrentThread.ManagedThreadId);
for (int i = ; i <= ; i++)
Console.WriteLine("Call Main()");
int result = task.Result;//阻塞主线程
Console.WriteLine("任务执行结果:{0}", result);
Console.ReadLine();
}
async static Task<int> AsyncMethod()
{
Console.WriteLine("使用Task执行异步操作.线程id:" + Thread.CurrentThread.ManagedThreadId);
await Task.Delay();
int sum = ;
Console.WriteLine("使用Task执行异步操作.线程id:"+Thread.CurrentThread.ManagedThreadId);
for (int i = ; i < ; i++)
{
sum += i;
}
return sum;
}
        /// <summary>
/// 并行任务
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
ConcurrentStack<int> stack = new ConcurrentStack<int>();
var t1 = new Task(() =>
{
stack.Push();
stack.Push();
});
t1.Start();
Console.WriteLine(DateTime.Now.ToString());
//t2 t3并行执行
var t2 = t1.ContinueWith((task) =>
{
int result;
stack.TryPop(out result);
Console.WriteLine("Task t2 pop result={0},Thread id {1}", result, Thread.CurrentThread.ManagedThreadId);
});
//t2,t3并行执行
var t3 = t1.ContinueWith(t =>
{
int result;
stack.TryPop(out result);
Console.WriteLine("Task t3 pop result={0},Thread id {1}", result, Thread.CurrentThread.ManagedThreadId);
});
Task.WaitAll(t2, t3);
//t4串行执行
var t4 = Task.Factory.StartNew(() =>
{
Console.WriteLine("当前集合元素个数:{0},Thread id {1}", stack.Count, Thread.CurrentThread.ManagedThreadId);
});
t4.Wait();
Console.ReadLine();
}
        /// <summary>
/// 子任务
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
Task<string[]> parent = new Task<string[]>(() =>
{
string[] array = new string[];
new Task(() => { array[] = "result1";Thread.Sleep(); }, TaskCreationOptions.AttachedToParent).Start();
new Task(() => { array[] = "result2"; Thread.Sleep(); }, TaskCreationOptions.AttachedToParent).Start();
return array;
});
parent.ContinueWith((task) =>
{
foreach(string str in task.Result)
{
Console.WriteLine("结果:" + str);
} });
parent.Start();
Console.WriteLine("主线程");
parent.Wait();//wait只能等到父Task结束,不能等到父线程的ContinueWith结束
Console.WriteLine("主线程");
Console.ReadLine();
}
        /// <summary>
/// 取消任务
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
var cts = new CancellationTokenSource();
var task = new Task<int>(() => TaskMethod("task 1", , cts.Token), cts.Token);
Console.WriteLine(task.Status);
Console.ReadLine();
cts.Cancel();
Console.WriteLine(task.Status);
Console.WriteLine("task1已经被取消!");
cts = new CancellationTokenSource();
task = new Task<int>(() => TaskMethod("task2 ", , cts.Token), cts.Token);
task.Start();
for (int i = ; i < ; i++)
{
Thread.Sleep();
Console.WriteLine(task.Status);
}
cts.Cancel();
for (int i = ; i < ; i++)
{
Thread.Sleep();
Console.WriteLine(task.Status);
}
Console.ReadLine();
}
static int TaskMethod(string name, int seconds, CancellationToken token)
{
Console.WriteLine("Task {0} is running on a thread id {1}. Is thread pool thread: {2}",
name, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);
for(int i = ; i < seconds; i++)
{
Thread.Sleep();
if (token.IsCancellationRequested)
{
return -;
}
}
return * seconds;
}

c# task笔记的更多相关文章

  1. 【Hadoop代码笔记】Hadoop作业提交之TaskTracker获取Task

    一.概要描述 在上上一篇博文和上一篇博文中分别描述了jobTracker和其服务(功能)模块初始化完成后,接收JobClient提交的作业,并进行初始化.本文着重描述,JobTracker如何选择作业 ...

  2. Android菜鸟的成长笔记(13)——异步任务(Async Task)

    原文:[置顶] Android菜鸟的成长笔记(13)——异步任务(Async Task) Android的UI线程主要负责处理用户的事件及图形显示,因此主线程UI不能阻塞,否则会弹出一个ANR(App ...

  3. WebAPI调用笔记 ASP.NET CORE 学习之自定义异常处理 MySQL数据库查询优化建议 .NET操作XML文件之泛型集合的序列化与反序列化 Asp.Net Core 轻松学-多线程之Task快速上手 Asp.Net Core 轻松学-多线程之Task(补充)

    WebAPI调用笔记   前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于 ...

  4. 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性

    基于.net的分布式系统限流组件   在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...

  5. spark 笔记 15: ShuffleManager,shuffle map两端的stage/task的桥梁

    无论是Hadoop还是spark,shuffle操作都是决定其性能的重要因素.在不能减少shuffle的情况下,使用一个好的shuffle管理器也是优化性能的重要手段. ShuffleManager的 ...

  6. spark 笔记 12: Executor,task最后的归宿

    spark的Executor是执行task的容器.和java的executor概念类似. ===================start executor runs task============ ...

  7. spark 笔记 9: Task/TaskContext

    DAGScheduler最终创建了task set,并提交给了taskScheduler.那先得看看task是怎么定义和执行的. Task是execution执行的一个单元. Task: execut ...

  8. MapReduce剖析笔记之三:Job的Map/Reduce Task初始化

    上一节分析了Job由JobClient提交到JobTracker的流程,利用RPC机制,JobTracker接收到Job ID和Job所在HDFS的目录,够早了JobInProgress对象,丢入队列 ...

  9. 异步-学习笔记3 Task

    1. 通过Task启动多线程 2. 解决多线程的几大应用场景 private void btnTask_Click(object sender, EventArgs e) { Console.Writ ...

随机推荐

  1. 套接字之sendmsg系统调用

    sendmsg系统调用允许在用户空间构造消息头和控制信息,用此函数可以发送多个数据缓冲区的数据,并支持控制信息:当调用进入内核后,会将用户端的user_msghdr对应拷贝到内核的msghdr中,然后 ...

  2. 基于Xposed hook 实时监测微信消息

    本文以微信版本6.7.3为例进行分析有hook, 大部分做微信机器人的话,首先要实时抓取微信的消息,在这里展示三种方式对微信的消息进行hook: 1.基于UI层拉取加载进行监听 2.基于微信dao层调 ...

  3. 学习曲线(learning curves)

    假定假设函数为一个二次函数,只是参数未定: 每给定一个样本大小,就能训练出对应的假设函数,从而利用这个假设函数可以计算出Jtrain(仍然在之前拿来训练的那些样本里面),然后将训练好的假设函数用在全部 ...

  4. one vs all -- 将01分类器用于多类分类问题

    大多数分类器都是01分类器,如logistic regression.当我们要将数据分为多类的时候, 可以用一种叫one-vs-all的方法将01分类器用于多类分类(mult-class classi ...

  5. rocketMQ 订阅关系

    场景:2 个消费者进程中,创建了 2 个消费者,同属于 1 个消费组,但是订阅了不同的 topic,会因为订阅信息相互覆盖,导致拉不到消息. 原因是 rocketMQ 的订阅关系,是根据 group ...

  6. LoadRunner 技巧之 检查点

    LoadRunner 技巧之 检查点 判断脚本是否执行成功是根据服务器返回的状态来确定的,如果服务器返回的HTTP状态为 200 OK ,那么VuGen 就认为脚本正确地运行了,并且是运行通过的.在绝 ...

  7. 【ABAP系列】SAP ABAP 关于FUNCTION-POOL的理解

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 关于FUNCT ...

  8. 完全分布式部署Hadoop

    完全分布式部署 Hadoop 分析: 1)准备 3 台客户机(关闭防火墙.静态 ip.主机名称) 2)安装 jdk 3)配置环境变量 4)安装 hadoop 5)配置环境变量 6)安装 ssh 7)配 ...

  9. 浅谈spring配置定时任务的几种方式

    网上看到好多关于定时任务的讲解,以前只简单使用过注解方式,今天项目中看到基于配置的方式实现定时任务,自己做个总结,作为备忘录吧. 基于注解方式的定时任务 首先spring-mvc.xml的配置文件中添 ...

  10. Hbase 0.92.1 Replication

    原集群 服务器名称 服务 sht-sgmhadoopnn-01 Master,NameNode,JobTracker sht-sgmhadoopdn-01 RegionServer,DataNode, ...