c# task笔记
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笔记的更多相关文章
- 【Hadoop代码笔记】Hadoop作业提交之TaskTracker获取Task
一.概要描述 在上上一篇博文和上一篇博文中分别描述了jobTracker和其服务(功能)模块初始化完成后,接收JobClient提交的作业,并进行初始化.本文着重描述,JobTracker如何选择作业 ...
- Android菜鸟的成长笔记(13)——异步任务(Async Task)
原文:[置顶] Android菜鸟的成长笔记(13)——异步任务(Async Task) Android的UI线程主要负责处理用户的事件及图形显示,因此主线程UI不能阻塞,否则会弹出一个ANR(App ...
- WebAPI调用笔记 ASP.NET CORE 学习之自定义异常处理 MySQL数据库查询优化建议 .NET操作XML文件之泛型集合的序列化与反序列化 Asp.Net Core 轻松学-多线程之Task快速上手 Asp.Net Core 轻松学-多线程之Task(补充)
WebAPI调用笔记 前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于 ...
- 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性
基于.net的分布式系统限流组件 在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...
- spark 笔记 15: ShuffleManager,shuffle map两端的stage/task的桥梁
无论是Hadoop还是spark,shuffle操作都是决定其性能的重要因素.在不能减少shuffle的情况下,使用一个好的shuffle管理器也是优化性能的重要手段. ShuffleManager的 ...
- spark 笔记 12: Executor,task最后的归宿
spark的Executor是执行task的容器.和java的executor概念类似. ===================start executor runs task============ ...
- spark 笔记 9: Task/TaskContext
DAGScheduler最终创建了task set,并提交给了taskScheduler.那先得看看task是怎么定义和执行的. Task是execution执行的一个单元. Task: execut ...
- MapReduce剖析笔记之三:Job的Map/Reduce Task初始化
上一节分析了Job由JobClient提交到JobTracker的流程,利用RPC机制,JobTracker接收到Job ID和Job所在HDFS的目录,够早了JobInProgress对象,丢入队列 ...
- 异步-学习笔记3 Task
1. 通过Task启动多线程 2. 解决多线程的几大应用场景 private void btnTask_Click(object sender, EventArgs e) { Console.Writ ...
随机推荐
- 2019java第十二周课程总结
本周主要还是学习图形界面 各种容器使用方法 如下代码: package text10; import java.awt.*; import java.io.File; import javax.swi ...
- RF-创建一个自定义关键字库
仓库自定义库 这里以Selenium2Library库进行举例说明: 编写一个自定义仓库类(与库文件夹名一致),继承关键字类,指定范围和版本即可. 需要声明__init__. import os fr ...
- Git-Runoob:Git 标签
ylbtech-Git-Runoob:Git 标签 1.返回顶部 1. Git 标签 如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 git tag 给它打上标签. 比如说,我 ...
- Android 面试汇总<三>
1.3 计算机网络 基础 Q:五层协议的体系结构分别是什么?每一层都有哪些协议? 技术点:网络模型.协议 思路:分条解释每层名字以及协议 参考回答: 物理层 数据链路层:逻辑链路控制LLC.媒体接入控 ...
- SI_WorkShop_V4安装手册
V4安装手册 第一步 启动workshopV4 解压workshopV4.rar,在解压后的目录中双击eclipse.exe启动workshopV4,启动画面如下图所示:(注:解压后第1次启动速度会慢 ...
- Synchronized知道这些就可以了
Synchronized关键字算是Java的元老级锁了,一开始它撑起了Java的同步任务,其用法简单粗暴容易上手.但是有些与它相关的知识点还是需要我们开发者去深入掌握的.比如,我们都知道通过Synch ...
- Windows客户端 Linux服务器通讯 字符编码问题
Windows下的字符编码默认是gb2312 在Linux下需要转成utf8 才能正确的看到对应的中文编码 提供转换函数 /*------------------------------------- ...
- cocos2dx基础篇(7) 触碰事件
cocos2dx游戏引擎的重点是在于移动设备的跨平台开发,而移动设备上的游戏大部分都是通过屏幕触碰来进行的.比如主菜单的按钮触碰,打飞机中飞机的触碰移动,都需要用到触碰操作.想一想之前讲的菜单按钮CC ...
- 【LeetCode】309、最佳买卖股票时机含冷冻期
Best Time to Buy and Sell Stock with Cooldown 题目等级:Medium 题目描述: Say you have an array for which the ...
- python基础--面向对象之绑定非绑定方法
# 类中定义的函数分为两大类, #一,绑定方法(绑定给谁,谁来调用就自动将它本身当做第一个参数传入) # 1,绑定到类的方法:用classmethod装饰器装饰的方法. # 对象也可以掉用,仍将类作为 ...