C# 任务、线程、同步(一)
2024-09-05 04:11:20
static object taskMethodLock = new object();
static void TaskMethod(object title)
{
lock (taskMethodLock)
{
Console.WriteLine(title);
Console.WriteLine("Task id: {0}, thread: {1}",
Task.CurrentId == null ? "no task" : Task.CurrentId.ToString(),
Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("is pooled thread: {0}", Thread.CurrentThread.IsThreadPoolThread);
Console.WriteLine("is background thread: {0}", Thread.CurrentThread.IsBackground);
Console.WriteLine();
}
}
1、线程池中的任务
var tf = new TaskFactory();
Task t1 = tf.StartNew(TaskMethod, "using a task factory"); Task t2 = Task.Factory.StartNew(TaskMethod, "factory via a task"); var t3 = new Task(TaskMethod, "using a task constructor and Start");
t3.Start(); Task t4 = Task.Run(() => TaskMethod("using the Run method"));
2、同步任务
TaskMethod("just the main thread");
var t1 = new Task(TaskMethod, "run sync");
t1.RunSynchronously();
3、使用单独线程的任务
var t1 = new Task(TaskMethod, "long running",TaskCreationOptions.LongRunning);
t1.Start();
4、Future 任务结果
static void ResultsFromTasks()
{
var t1 = new Task<Tuple<int, int>>(TaskWithResult, Tuple.Create<int, int>(, ));
t1.Start();
Console.WriteLine(t1.Result); t1.Wait(); Console.WriteLine("result from task: {0} {1}", t1.Result.Item1, t1.Result.Item2);
}
static Tuple<int, int> TaskWithResult(object division)
{
Tuple<int, int> div = (Tuple<int, int>)division;
int result = div.Item1 / div.Item2;
int reminder = div.Item1 % div.Item2;
Console.WriteLine("task creates a result ..."); return Tuple.Create<int, int>(result, reminder);
}
5、连续任务
static void ContinuationTask()
{
Task t1 = new Task(DoOnFirst);
Task t2 = t1.ContinueWith(DoOnSecond);
Task t3 = t1.ContinueWith(DoOnSecond);
Task t4 = t1.ContinueWith(DoOnSecond);
Task t5 = t1.ContinueWith(DoOnError, TaskContinuationOptions.OnlyOnFaulted);
t1.Start(); Thread.Sleep(); }
static void DoOnFirst()
{
Console.WriteLine("doing some task {0}", Task.CurrentId);
Thread.Sleep();
}
static void DoOnSecond(Task t)
{
Console.WriteLine("task {0} finished", t.Id);
Console.WriteLine("this task id {0}", Task.CurrentId);
Console.WriteLine("do some cleanup");
Thread.Sleep();
}
static void DoOnError(Task t)
{
Console.WriteLine("task {0} had an error!", t.Id);
Console.WriteLine("my id {0}", Task.CurrentId);
Console.WriteLine("do some cleanup");
}
6、任务层次结构
static void ParentAndChild()
{
var parent = new Task(ParentTask);
parent.Start();
Thread.Sleep();
Console.WriteLine(parent.Status);
Thread.Sleep();
Console.WriteLine(parent.Status); }
static void ParentTask()
{
Console.WriteLine("task id {0}", Task.CurrentId);
var child = new Task(ChildTask); // , TaskCreationOptions.DetachedFromParent);
child.Start();
Thread.Sleep();
Console.WriteLine("parent started child");
// Thread.Sleep(3000);
}
static void ChildTask()
{
// Console.WriteLine("task id {0}, parent: {1}", Task.Current.Id, Task.Current.Parent.Id);
Console.WriteLine("child");
Thread.Sleep();
Console.WriteLine("child finished");
}
最新文章
- 【Java EE 学习 77 上】【数据采集系统第九天】【通过AOP实现日志管理】【通过Spring石英调度动态生成日志表】【日志分表和查询】
- 使用sklearn进行集成学习——实践
- 微信小程序-视图模板
- DataTable得到某行某列的值
- 面向对象分析方法(II)
- IP 碎片重组
- android调用系统图片浏览器裁切后出现黑边
- 配置mysql允许远程连接
- 2761: [JLOI2011]不重复数字(平衡树)
- web前端图片上传(2)
- MySQL InnoDB 日志管理机制中的MTR和日志刷盘
- 使php支持pdo_mysql
- python3 字符串str
- 转: hibernate配置文件hibernate.cfg.xml和.hbm.xml的详细解释
- Hadoop Avro支持多输入AvroMultipleInputs
- Python Socket通信例子
- PHP微信公共号H5支付。
- 算法练习,链表二分最大n个
- SiteMapPath基本用法
- 基于Vue的Ui框架
热门文章
- linux下安装lnmp集成环境
- pandas数据结构之DataFrame笔记
- apache - storm - Setting Up a Development Environment
- 阿里云Centos7 搭建laravel
- Docker使用整理
- 奇妙的算法【11】LeetCode-专属算法面试题汇总
- ASP.NET 使用 SyndicationFeed 输出 Rss
- ASP.NET WEB应用程序(.network4.5)MVC 工作原理
- 用js原生加jquery实现下拉跳转至商品详情页,上拉回到商品简介
- 【转载】salesforce 零基础开发入门学习(四)多表关联下的SOQL以及表字段Data type详解