C#线程安全使用(一)

简介: 关于Task的使用,一直都是半知半解,最近终于有时间详细的看了一遍MSDN,作为备忘录,将心得也记录下来和大家分享。 首先,根据MSDN的描述,Task是FrameWork4引进的新功能,他和ConCurrent命名空间一起被引进,用来替代Thread的使用。

关于Task的使用,一直都是半知半解,最近终于有时间详细的看了一遍MSDN,作为备忘录,将心得也记录下来和大家分享。

首先,根据MSDN的描述,Task是FrameWork4引进的新功能,他和ConCurrent命名空间一起被引进,用来替代Thread的使用。

根据我的使用,个人觉得,他确实比Thead的功能要丰富一些。

先一个最简单的例子

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace TaskConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            //当前线程标识
            Console.WriteLine(Thread.CurrentThread.GetHashCode());

            Task task = new Task(run);
            Console.WriteLine("任务标识:" + task.GetHashCode() + ",状态:" + task.Status);//状态 
            task.Start();
            Console.WriteLine("任务标识:" + task.GetHashCode() + ",状态:" + task.Status);//状态

            //任务完成后执行新任务
            Action<Task> ation = new Action<Task>(taskStart);
            task.ContinueWith(ation);


            Console.Read();
        }

        public static void taskStart(Task task)
        {
            task = new Task(run);
            task.Start();
            //如果注释上面两句话,则任务标识为 task.ContinueWith(ation)中task的任务
            Console.WriteLine("任务标识:" + task.GetHashCode() + ",状态:" + task.Status + ",当前线程:" + Thread.CurrentThread.GetHashCode());//状态
             
        }


        public static void run()
        { 
            Console.WriteLine("this is run");
        }
    }
}
View Code

 

解释几个方法:

一,task.GetHashCode(),是获取Task实例的唯一标识,每个Task都不一样。但是,经过我的测试发现,Task.GetHashCode()并不等于Thread.CurrentThread.GetHashCode()。

二,task.ContinueWith(),是任务结束后继续执行任务的方法,传一个Action,当任务结束后,触发该Action。

运行结果如下,任务刚new出来的时候,task就又状态了,是Created,一但运行了,状态就是WaitingToRun。

根据MSDN的说明,Task.State是获取TaskState的枚举值,其枚举值代表的意义如下(直接复制了MSDN的解释)

成员名称 说明
受 可移植类库 支持受 适用于 Windows 应用商店应用的 .NET 支持 Canceled 该任务已通过对其自身的 CancellationToken 引发 OperationCanceledException 对取消进行了确认,此时该标记处于已发送信号状态;或者在该任务开始执行之前,已向该任务的 CancellationToken 发出了信号。 有关更多信息,请参见任务取消
受 可移植类库 支持受 适用于 Windows 应用商店应用的 .NET 支持 Created 该任务已初始化,但尚未被计划。
受 可移植类库 支持受 适用于 Windows 应用商店应用的 .NET 支持 Faulted 由于未处理异常的原因而完成的任务。
受 可移植类库 支持受 适用于 Windows 应用商店应用的 .NET 支持 RanToCompletion 已成功完成执行的任务。
受 可移植类库 支持受 适用于 Windows 应用商店应用的 .NET 支持 Running 该任务正在运行,但尚未完成。
受 可移植类库 支持受 适用于 Windows 应用商店应用的 .NET 支持 WaitingForActivation 该任务正在等待 .NET Framework 基础结构在内部将其激活并进行计划。
受 可移植类库 支持受 适用于 Windows 应用商店应用的 .NET 支持 WaitingForChildrenToComplete 该任务已完成执行,正在隐式等待附加的子任务完成。
受 可移植类库 支持受 适用于 Windows 应用商店应用的 .NET 支持 WaitingToRun 该任务已被计划执行,但尚未开始执行。
目录
相关文章
|
4月前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。
178 3
|
4月前
|
安全 编译器 C#
C#学习相关系列之多线程---lock线程锁的用法
C#学习相关系列之多线程---lock线程锁的用法
|
4月前
|
并行计算 安全 Java
C# .NET面试系列四:多线程
<h2>多线程 #### 1. 根据线程安全的相关知识,分析以下代码,当调用 test 方法时 i > 10 时是否会引起死锁? 并简要说明理由。 ```c# public void test(int i) { lock(this) { if (i > 10) { i--; test(i); } } } ``` 在给定的代码中,不会发生死锁。死锁通常是由于两个或多个线程互相等待对方释放锁而无法继续执行的情况。在这个代码中,只有一个线程持有锁,且没有其他线程参与,因此不
221 3
|
4月前
|
Java 调度 C#
C#学习系列相关之多线程(一)----常用多线程方法总结
C#学习系列相关之多线程(一)----常用多线程方法总结
|
4月前
|
C#
C#学习相关系列之多线程---ConfigureAwait的用法
C#学习相关系列之多线程---ConfigureAwait的用法
|
4月前
|
C#
C#学习相关系列之多线程---TaskCompletionSource用法(八)
C#学习相关系列之多线程---TaskCompletionSource用法(八)
|
4月前
|
Java C#
C#学习系列相关之多线程(五)----线程池ThreadPool用法
C#学习系列相关之多线程(五)----线程池ThreadPool用法
|
26天前
|
数据采集 XML JavaScript
C# 中 ScrapySharp 的多线程下载策略
C# 中 ScrapySharp 的多线程下载策略
|
30天前
|
安全 C# 开发者
【C# 多线程编程陷阱揭秘】:小心!那些让你的程序瞬间崩溃的多线程数据同步异常问题,看完这篇你就能轻松应对!
【8月更文挑战第18天】多线程编程对现代软件开发至关重要,特别是在追求高性能和响应性方面。然而,它也带来了数据同步异常等挑战。本文通过一个简单的计数器示例展示了当多个线程无序地访问共享资源时可能出现的问题,并介绍了如何使用 `lock` 语句来确保线程安全。此外,还提到了其他同步工具如 `Monitor` 和 `Semaphore`,帮助开发者实现更高效的数据同步策略,以达到既保证数据一致性又维持良好性能的目标。
27 0