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 ...
随机推荐
- 【Spark机器学习速成宝典】基础篇01Windows下spark开发环境搭建+sbt+idea(Scala版)
注意: spark用2.1.1 scala用2.11.11 材料准备 spark安装包 JDK 8 IDEA开发工具 scala 2.11.8 (注:spark2.1.0环境于scala2.11环境开 ...
- jQuery .delay()
.delay() Effects > Custom .delay( duration [, queueName ] )Returns: jQuery Description: Set a tim ...
- 验证TXT解析的正确性
需要用到TXT解析,不同于CNAME和A解析,可以用PING命令验证,要验证TXT解析需要用到如下命令 nslookup -q=TXT txtdemo.lei.cool 8.8.8.8 输出内容如下 ...
- 1. 参数的传入和添加 argparse.ArgumentParser()
# Edit configuration 传入的参数使用的是--file_dir picture, 获取使用的是argv.file_dir import argparse, sys def parse ...
- 服务器被攻击后当作矿机,高WIO
__ 矿机特点: 操作系统反应慢. wio 非常高,一般轻松达到50%,甚至达到100%. 在/root/ 下存在 .ddg 隐藏路径.路径中有nnnn.db 二进制文件. /tmp ./usr ...
- ElasticSearch第五步-.net平台下c#操作ElasticSearch详解
前面我们讲解了关于ElasticSearch的安装配置,以及CRUD 本章我将讲解怎么使用c#操作ElasticSearch. 首先你需要一定的技术储备,比如:asp.net webapi,mvc,j ...
- linux系统导入证书
https://blog.csdn.net/fy573060627/article/details/52872740 .linux 访问 https 证书问题 [root@kube-node2 ~]# ...
- 使用canvas实现对图片的批量打码
最近有个需求,利用h5的canvas对图片一些涉及个人隐私的地方进行打码再上传,而且最好能实现批量打码.意思是在一张图片上对哪些地方做了打码,后续的所有图片都在同样的地方也可以自动打上码,不用人工一张 ...
- char* a = "abc" 和 char a[] = "abc" 之间的区别
char* a = "abc"; 声明了一个字符类型的指针a,并为它赋值初始值为"abc",a的值是字符串"abc"的首地址[第一个字符的地 ...
- vs2015中将复制过来的文件夹显示目录文件
先将文件夹和文件复制到VS程序所在的位置,点击解决方案资源管理器上的“显示所有文件”按纽,展开这个文件夹,这样你就可以看到这个文件或者文件夹了,这时,这个文件或者文件夹是虚线构成的.你右击这个文件或者 ...