zoukankan      html  css  js  c++  java
  • C#线程安全使用(一)

    关于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 该任务已被计划执行,但尚未开始执行。

    ----------------------------------------------------------------------------------------------------

    注:此文章为原创,任何形式的转载都请联系作者获得授权并注明出处!
    若您觉得这篇文章还不错,请点击下方的推荐】,非常感谢!

     

  • 相关阅读:
    linux 内核升级
    maven 热部署至tomcat
    Executor多线程框架使用
    数据库中的一些连接
    Ajax传统操作
    第三篇、简单的图片下载器
    第二篇、通过蓝牙连接外设
    第一篇、实现上拉和下拉刷新
    解决Git报错:The current branch is not configured for pull No value for key branch.master.merge found in configuration
    Spark核心概念
  • 原文地址:https://www.cnblogs.com/kiba/p/3375458.html
Copyright © 2011-2022 走看看