博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# Task的使用---Task的启动
阅读量:6789 次
发布时间:2019-06-26

本文共 2943 字,大约阅读时间需要 9 分钟。

.NET 4.0包含的新名称空间System.Threading.Tasks,它包含的类抽象出了线程功能。任务表示应完成的某个单元的工作。这个单元的工作可以在单独的线程中运行,也可以以同步的方式启动一个任务,这需要等待主调线程。使用任务不仅可以获得一个抽象层,还可以对底层线程进行许多控制。

启动任务

    1)、使用TaskFactory类的实例,在其中把TaskMethod()方法传递给StartNew方法,就会立即启动任务。

1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text;
5: using System.Threading;
6: using System.Threading.Tasks;
7: namespace TaskSamples
8: {
9:     class Program
10:     {
11:         static void TaskMethod()
12:         {
13:             Console.WriteLine("running in a task");
14:             Console.WriteLine("Task id:{0}",Task.CurrentId);
15:         }
16: 
17:         static void Main(string[] args)
18:         {
19:             //using task factory
20:             TaskFactory tf = new TaskFactory();
21:             Task t1 = tf.StartNew(TaskMethod);
22:             Console.ReadKey();
23:          }
24:     }
25: }

运行结果如下所示:

 

2)、使用Task类的Factory属性,Task.Factory返回TaskFactory的默认实例。在其中把TaskMethod()方法传递给StartNew方法。这种方法实际和第一种方法是一样的。

1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text;
5: using System.Threading;
6: using System.Threading.Tasks;
7: namespace TaskSamples
8: {
9:     class Program
10:     {
11:         static void TaskMethod()
12:         {
13:             Console.WriteLine("running in a task");
14:             Console.WriteLine("Task id:{0}",Task.CurrentId);
16: 
17:
15:         }
18:         static void Main(string[] args)
19:         {
20:
21:             //using the task factory via a task
22:             Task t2 = Task.Factory.StartNew(TaskMethod);
23:             Console.ReadKey();
24:          }
25:     }
26: }

3)、使用Task类的实例,然后调用Start方法启动任务。运行结果和上面两种方式相同。在使用Task类时,除了调用Start()方法,还可以调用RunSynchronously()方法。这样任务也会启动,但在调用者的当前线程中,它正在运行的时候,调用者需要一直等待到该任务结束。默认情况下,任务是异步运行的。

1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text;
5: using System.Threading;
6: using System.Threading.Tasks;
7: namespace TaskSamples
8: {
9:     class Program
10:     {
11:         static void TaskMethod()
12:         {
13:             Console.WriteLine("running in a task");
14:             Console.WriteLine("Task id:{0}",Task.CurrentId);
15:         }
16:
17:         static void Main(string[] args)
18:         {
19:             using Task constructor
20:             Task t3 = new Task(TaskMethod);
21:             t3.Start();
22:             Console.ReadKey();
23:          }
24:     }
25: }

使用Task类的构造函数和TaskFactory类的StartNew()方法时,都可以传递TaskCreationOptions枚举中的值。设置LongRunning选项,可以通知任务调度器,该任务需要较长时间执行,这样调度器更可能使用新线程。如果该任务应关联到父任务上,而父任务取消了,则该任务也应取消,此时应设置AttachToParent选项。PerferFairness的值表示,调度器应提取出已在等待的第一个任务。如果一个任务在另一个任务内容创建,这就不是默认情况。如果任务使用了子任务创建了其他工作,子任务就优先于其他任务。它们不会排在线程池队列中的最后。如果这些任务应以公平的方式与所有其他任务一起处理,就设置该选项为PerferFairness。

1: Task t3 = new Task(TaskMethod,TaskCreationOptions.PreferFairness);
2:           t3.Start();

转载于:https://www.cnblogs.com/ChineseMoonGod/p/5234965.html

你可能感兴趣的文章
Javascript 拖拽 放大镜
查看>>
利用PowerShell创建事件日志
查看>>
python光荣之路测试开发班list学习笔记
查看>>
【c#】Excel COM组件在.net程序中的使用
查看>>
python的一些细节(持续更新中)
查看>>
requests中 .text 和 .content区别
查看>>
自定义 java 加载器
查看>>
JavaScript删除数组重复元素的5个高效算法
查看>>
【SVN】setup SVN Server
查看>>
Powershell 提示错误:get-help about_signing 解决
查看>>
cisco 和 华为的设备如何设置命令不分页显示
查看>>
nethogs监控进程网络流量
查看>>
Win7下chm文件无法打开问题解决方法
查看>>
DDOS***类型以及iptables防范ddos脚本
查看>>
我的友情链接
查看>>
基于MVC+EasyUI的Web开发框架经验总结(9)--在Datagrid里面实现外键字段的转义操作...
查看>>
sql Left right join 多表 注意表的连接顺序
查看>>
HTML5与CSS3基础教程第八版学习笔记11~15章
查看>>
Redis -- 过期时间 和 缓存 例子
查看>>
babel7-按需加载polyfill
查看>>