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. 2019java第十二周课程总结

    本周主要还是学习图形界面 各种容器使用方法 如下代码: package text10; import java.awt.*; import java.io.File; import javax.swi ...

  2. RF-创建一个自定义关键字库

    仓库自定义库 这里以Selenium2Library库进行举例说明: 编写一个自定义仓库类(与库文件夹名一致),继承关键字类,指定范围和版本即可. 需要声明__init__. import os fr ...

  3. Git-Runoob:Git 标签

    ylbtech-Git-Runoob:Git 标签 1.返回顶部 1. Git 标签 如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 git tag 给它打上标签. 比如说,我 ...

  4. Android 面试汇总<三>

    1.3 计算机网络 基础 Q:五层协议的体系结构分别是什么?每一层都有哪些协议? 技术点:网络模型.协议 思路:分条解释每层名字以及协议 参考回答: 物理层 数据链路层:逻辑链路控制LLC.媒体接入控 ...

  5. SI_WorkShop_V4安装手册

    V4安装手册 第一步 启动workshopV4 解压workshopV4.rar,在解压后的目录中双击eclipse.exe启动workshopV4,启动画面如下图所示:(注:解压后第1次启动速度会慢 ...

  6. Synchronized知道这些就可以了

    Synchronized关键字算是Java的元老级锁了,一开始它撑起了Java的同步任务,其用法简单粗暴容易上手.但是有些与它相关的知识点还是需要我们开发者去深入掌握的.比如,我们都知道通过Synch ...

  7. Windows客户端 Linux服务器通讯 字符编码问题

    Windows下的字符编码默认是gb2312 在Linux下需要转成utf8 才能正确的看到对应的中文编码 提供转换函数 /*------------------------------------- ...

  8. cocos2dx基础篇(7) 触碰事件

    cocos2dx游戏引擎的重点是在于移动设备的跨平台开发,而移动设备上的游戏大部分都是通过屏幕触碰来进行的.比如主菜单的按钮触碰,打飞机中飞机的触碰移动,都需要用到触碰操作.想一想之前讲的菜单按钮CC ...

  9. 【LeetCode】309、最佳买卖股票时机含冷冻期

    Best Time to Buy and Sell Stock with Cooldown 题目等级:Medium 题目描述: Say you have an array for which the ...

  10. python基础--面向对象之绑定非绑定方法

    # 类中定义的函数分为两大类, #一,绑定方法(绑定给谁,谁来调用就自动将它本身当做第一个参数传入) # 1,绑定到类的方法:用classmethod装饰器装饰的方法. # 对象也可以掉用,仍将类作为 ...