博客
关于我
浅学C#(25)——任务Task
阅读量:638 次
发布时间:2019-03-15

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

在C#中, ThreadPool是一个非常重要的任务安排器,它能够在后台安排需要完成的工作。任务提供了极大的灵活性,允许开发者定义连续的工作流程。可以根据需要定义任务的顺序,例如,一个任务完成后可以立即启动另一个任务。此外,任务还支持层次结构,父任务可以创建子任务,这样可以定义依赖关系。启动任务可以通过TaskFactory类或Task类的构造函数和Start()方法来实现。例如:```csharpstatic void TaskMethod(){    Console.WriteLine("running in a task");    Console.WriteLine("Task id: {0} {1}", Task.CurrentId, Thread.CurrentThread.ManagedThreadId);}TaskFactory tf = new TaskFactory();Task t1 = tf.StartNew(TaskMethod);

或者使用Task类的构造函数:

Task t3 = new Task(TaskMethod);t3.Start();

此外,还可以设置TaskCreationOptions来指定任务的特定行为,如设置LongRunning选项,通知任务调度器该任务需要长时间运行,让调度器更可能使用新线程。

如果一个任务关联到父任务,而父任务被取消,子任务也会被取消。为了确保多个任务能公平运行,可以设置 PreferFairness选项。任务的连续执行可以通过ContinueWith方法实现,例如:

Task t1 = new Task(DoOnFirst);Task t2 = t1.ContinueWith(DoOnSecond);

无论前一个任务是成功还是失败,后续任务都会在前一个任务结束时启动。可以通过TaskContinuationOptions来指定仅在任务成功或失败时启动后续任务。

任务层次结构允许多个子任务并行执行,并定义父子关系。父任务的状态会反映其等待子任务完成的情况。一旦所有子任务完成,父任务也会显示为完成。设置TaskCreationOptions.DetachedFromParent时,子任务将不再依赖父任务。

任务的结果可以通过Task类的泛型版本来定义返回值。例如,可以定义一个返回整数的任务:

Task
t = Task.Factory.StartNew(() => { /* 任务代码 */ });

这些信息可以帮助开发者理解如何在C#中使用Threadpool和任务异步编程来优化应用性能。

此外,关于并发控制,可以通过Synchronization属性将对象的成员同步化。对于需要读取和写入同时访问的资源,可以用ReaderWriterLockSlim实现更细粒度的锁定控制,允许多个读取器和一个写入器同时运行。

这些功能在开发多线程应用时非常有用,能够帮助提高效率并避免死锁。如在一个银行账户应用中,同步可以防止并发问题,确保交易的准确性。

转载地址:http://qjalz.baihongyu.com/

你可能感兴趣的文章
IEDA全局搜索快捷键 Ctrl+shift+F无效的原因、 eclipse:Ctrl + h 进行全局搜索
查看>>
LeetCode: 138. 复制带随机指针的链表(中等)[DFS, 迭代]
查看>>
Effective Java 读书笔记
查看>>
SpringBoot使用@Email报错误
查看>>
Rabbitmq的内存磁盘监控
查看>>
访问servlet时弹出文件下载框解决方法
查看>>
Java中的注释
查看>>
cookie、session、token
查看>>
IDEA-@Slf4j和log标签&@Data(Lombok)无效
查看>>
SpringCloud-Eureka报错 Error creating bean with name解决
查看>>
Thymeleaf 生成下标,索引,使用Stat变量
查看>>
全局变量初始化顺序的不确定性引发的bug
查看>>
ValueError: Unexpected end of file.
查看>>
六、登录(二)
查看>>
初始微服务---Springcloud发展【第一期】
查看>>
RAFT 拜占庭将军 共识算法
查看>>
UE4 错误列表 error码(只记录我遇到的情况,持续添加,未完成)
查看>>
【.net+jquery】绘制自定义表单(含源码)
查看>>
could not initialize proxy - no Session (SSH)
查看>>
cmd编译.java文件 : java:720: 错误: 编码GBK的不可映射字符 Why ? ? ? ?
查看>>