返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#线程开发之System.Thread类详解
  • 807
分享到

C#线程开发之System.Thread类详解

2024-04-02 19:04:59 807人浏览 薄情痞子
摘要

一、属性 CurrentContext    获取线程正在其中执行的当前上下文。ExecutionContext    获

一、属性

  • CurrentContext    获取线程正在其中执行的当前上下文。
  • ExecutionContext    获取 ExecutionContext 对象,该对象包含有关当前线程的各种上下文的信息。
  • CurrentCulture    获取或设置当前线程的区域性。
  • CurrentUICulture    获取或设置资源管理器使用的当前区域性以便在运行时查找区域性特定的资源。
  • CurrentThread    获取当前正在运行的线程。
  • IsAlive    获取指示当前线程的执行状态的值。
  • IsBackground    获取或设置一个值,该值指示某个线程是否为后台线程。
  • IsThreadPoolThread    获取指示线程是否属于托管线程池的值。
  • ManagedThreadId    获取当前托管线程的唯一标识符。
  • Name    获取或设置线程的名称。
  • Priority    获取或设置指示线程的调度优先级的值。
  • ThreadState    获取一个值,该值包含当前线程的状态。

二、创建和控制线程

Thread 类的构造函数重载为接受ThreadStart和ParameterizedThreadStart类型的委托参数。
ThreadStart委托定义了一个返回类型为void的无参数方法。在创建了 Thread对象后,就可以用Start()方法启动线程:

class Program
{
    static void Main()
    {
        var t1 = new Thread(ThreadMain);
        t1.Start();
        Console.WriteLine("This is the main thread.");
    }
    static void ThreadMain()
    {
        Console.WriteLine("Running in a thread.");
    }
}

Lambda表达式还可以与Thread类一起 使用,将线程方法的实现代码传送给Thread构造函数的实参:

static void Main()
{
    var t1 = new Thread(() => Console.WriteLine("running in a thread, id: {0}",Thread.CurrentThread.ManagedThreadId));
    t1.Start();
    Console.WriteLine("This is the main thread, id: {0}",
    Thread.CurrentThread.ManagedThreadId);
}

三、给线程传递参数

给线程传递一些数据可以采用两种方式。

1、ParameterizedThreadStart委托参数

要给线程传递数据,需要某个存储数据的类或结构。这里定义了包含字符串的Data结构,但可以传递任意对象.

static void Main()
{
    var d = new Data { Message = "Info" };
    var t2 = new Thread(ThreadMainWithParameters);//ParameterizedThreadStart委托实例
    t2.Start(d);
}
static void ThreadMainWithParameters(object o)//如果使用了 ParameterizedThreadStart委托,线程的入口点必须有一个object类型的参数,且返回类型为void。
{
    Data d = (Data)o;
    Console.WriteLine("Running in a thread, received {0}", d.Message);
}
public struct Data
{
    public string Message;
}

2、创建一个自定义类,把线程的方法定义为实例方法

给新线程传递数据的另一种方式是定义一个类(参见MyThread类),在其中定义需要的字段,将线程的调用的方法定义为类的一个实例方法:

static void Main()
{
    var obj = new MyThread("info");
    var t3 = new Thread(obj.ThreadMain);//实例方法
    t3.Start();
}
//实例方法
public class MyThread
{
    private string data;
    public MyThread(string data)
    {
        this.data = data;
    }
    public void ThreadMain()
    {
        Console.WriteLine("Running in a thread, data: {0}", data);
    }
}

四、后台线程

只要有一个前台线程在运行,应用程序的进程就在运行。
如果多个前台线程在运行,而Main()方法结束了,应用程序的进程就仍然是激活的,直到所有前台线程完成其任务为止。
在默认情况下,用Thread类创建的线程是前台线程。线程池屮的线程总是后台线程。
在用Thread类创建线程时,可以设置IsBackground属性,以确定该线程是前台线程还是后台线程。

五、线程的优先级

在Thread类中,可以设置Priority属性,以影响线程的基本优先级。Priority属性需要ThreadPriority 枚举定义的一个值。定义的级别有Highest、AboveNomal、BelowNORMal和Lowest。

六、控制线程

  • 调用Thread对象的Start()方法,可以创建线程。但是,在调用Start()方法后,新线程仍不是处于Running状态,而是处于Unstarted状态。只要操作系统的线程调度器选择了要运行的线程,线程就会改为Running状态。读取Thread.ThreadState属性,就可以获得线程的当前状态。
  • 使用ThreadSleep()方法,会使线程处于WaitSleepJoin状态,在经历Sleep()方法定义的时间段后,线程就会等待再次被唤醒。
  • 要停止另一个线程,可以调用Thread.Abort() 方法。调用这个方法时,会在接到终止命令的线程中抛出一个ThreadAbortExcepticm类型的异常。用一个处理程序捕获这个异常,线程可以在结束前完成一些淸理工作。线程还可以在接收到调用Thread.ResetAbort()方法的结果ThreadAbortExcepdon 异常后继续运行。如果线程没有重置终止,接收到终止请求的线程的状态就从AbortRequested改为 Aborted。
  • 如果需要等待线程的结束,就可以调用Thread.Join()方法。Thread.Join()方法会停止当前线程, 并把它设置为WaitSleepJoin状态,直到加入的线程完成为止。
public class Worker
{
    // 此方法将在线程启动时调用。
    public void DoWork()
    {
        while (!_shouldStop)
        {
            Console.WriteLine("工作线程: working...");
        }
        Console.WriteLine("工作线程:正常停止");
    }
    public void RequestStop()
    {
        _shouldStop = true;
    }
    // Volatile用于提示编译器这个数据成员将被多个线程访问。
    private volatile bool _shouldStop;
}

static void Main()
{
    // 创建thread对象,但这不会启动线程。
    Worker workerObject = new Worker();
    Thread workerThread = new Thread(workerObject.DoWork);

    // 启动工作线程。
    workerThread.Start();
    Console.WriteLine("main thread: 启动工作线程...");

    // 循环,直到工作线程激活。
    while (!workerThread.IsAlive) ;

    // 将主线程休眠1毫秒,让工作线程做一些工作:
    Thread.Sleep(1);

    // 请求工作线程停止自身:
    workerObject.RequestStop();//workerObject.Abort()

    //使用Join方法阻塞当前线程,直到工作线程执行完毕才往下执行
    workerThread.Join();
    Console.WriteLine("main thread: 工作线程已经终止.");
}

七、使用线程实现回调

//定义一个委托实现回调函数 
public delegate void CallBackDelegate(string message);

void Main()
{
    //委托实现方法和定义线程
    CallBackDelegate cbd = CallBack;
    Thread thread = new Thread(initFtpParam);
    thread.Start(cbd);
}

/// <summary>
/// 线程方法
/// </summary>
/// <param name="obj"></param>
public void initFtpParam(object obj)
{
    CallBackDelegate callBackDelegate = obj as CallBackDelegate;
    callBackDelegate("aa");//执行委托
}

/// <summary>
/// 回调方法
/// </summary>
/// <param name="message"></param>
private void CallBack(string message)
{
    Console.Write(message);
}

八、区域性和线程

  • CurrentUICulture属性可返回当前用户界面区域性。该属性由 ResourceManager 类用于在运行时查找区域性特定资源。
    可以使用非特定区域性、特定区域性或 InvariantCulture 来设置 CurrentUICulture 属性。
    默认值是操作系统用户界面语言。
  • CurrentCulture属性用来决定诸如货币、数字和日期如何格式化。
    CurrentCulture 属性不是一个语言设置。它仅包含与地理区域的标准设置相关的数据。因此,只能将 CurrentCulture 属性设置为特定区域性,比如"fr-FR"或 InvariantCulture。
    默认值是操作系统的User Locale,我们可以在控制面板里设置。CultureInfo.UseUserOverride属性指示是否使用用户在控制面板自定义的 数字、符号、日期、货币等的格式。

1、.net4.5之前,只能用以下代码只能针对单个线程,如果每次执行线程 都要重新设置一下。。。
新开一个新线程,默认的CurrentCulture为系统的Culture,如果要改变当前线程的Culture,需要在线程中修改 Thread.CurrentCulture值来实现。

m.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US");

2、如果使用的.net环境是4.5及以上版本,CultureInfo提供了两个静态属性DefaultThreadCulture和DefaultThreadUICulture,一处修改即可实现所有的未显式设置Thread.CurrentCulture的线程都使用这个Default值。

System.Globalization.CultureInfo.DefaultThreadCurrentCulture = new System.Globalization.CultureInfo("en-US");
System.Globalization.CultureInfo.DefaultThreadCurrentUICulture = new System.Globalization.CultureInfo("en-US");

到此这篇关于C#线程开发之System.Thread类的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: C#线程开发之System.Thread类详解

本文链接: https://lsjlt.com/news/148494.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C#线程开发之System.Thread类详解
    一、属性 CurrentContext    获取线程正在其中执行的当前上下文。ExecutionContext    获...
    99+
    2024-04-02
  • C#多线程开发之任务并行库详解
    目录前言任务并行库 一、创建任务二、使用任务执行基本操作三、处理任务中的异常总结前言 之前学习了线程池,知道了它有很多好处。 使用线程池可以使我们在减少并行度花销时节省操作系统资源。...
    99+
    2024-04-02
  • C++线程之thread详解
    目录1.创建线程2.守护线程3.可调用对象4.传参5.线程的移动和复制6.线程id7.互斥mutex总结1.创建线程 直接初始话thread类对象进行创建线程,创建线程后调用join...
    99+
    2024-04-02
  • C#开发WinForm之DataGridView开发详解
    DataGridView是C# WinForm中常用的控件之一,用于显示和编辑数据。本文将详细介绍DataGridView的开发过程...
    99+
    2023-08-15
    C#
  • Android开发之多线程处理、Handler详解
      Android开发过程中为什么要多线程   我们创建的Service、Activity以及Broadcast均是一个主线程处理,这里我们可以理解为UI线程。但是在操...
    99+
    2022-06-06
    android开发 handler 多线程 线程 Android
  • C#多线程之线程池ThreadPool详解
    一、ThreadPool概述 提供一个线程池,该线程池可用于执行任务、发送工作项、处理异步 I/O、代表其他线程等待以及处理计时器。 创建线程需要时间。如果有不同的小任务要完成,就可...
    99+
    2024-04-02
  • C++学习之线程详解
    目录开篇线程的状态多线程的构建计算时间一、程序运行时间二、chrono共享资源和互斥锁condition_variable线程池总结开篇 多线程是开发中必不可少的,往往我们需要多个任...
    99+
    2024-04-02
  • JavaThread多线程开发中Object类详细讲解
    目录方法概览Threadwait  notify notifyAll方法详解作用阻塞阶段唤醒阶段遇到中断代码展示特点通过wait notify方法实现生产者和消费者slee...
    99+
    2023-03-01
    Java Object类 Java Thread多线程
  • C#多线程开发实战记录之线程基础
    目录前言线程基础 1、创建线程2、暂停线程3、线程等待4、线程终止C#中的lock关键字总结前言 最近由于工作的需要,一直在使用C#的多线程进行开发,其中也遇到了很多问题,但也都解决...
    99+
    2024-04-02
  • C#多线程之线程绑定ThreadLocal类
    在.Net 4.0的Thread里,新增了线程局部变量(ThreadLocal)类,可以很方便的实现线程专有存储。 应用场景 线程专有存储应被用于这样的多线程应用:它们经常访问那些逻...
    99+
    2024-04-02
  • C++线程中几类锁的详解
    目录C++线程中的几类锁互斥锁条件锁自旋锁读写锁参考博客总结C++线程中的几类锁 多线程中的锁主要有五类:互斥锁、条件锁、自旋锁、读写锁、递归锁。一般而言,所得功能与性能成反比。而且...
    99+
    2024-04-02
  • 详解Android 开发中的线程
    今天就跟大家聊聊有关详解Android 开发中的线程,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Android 开发中线程的分析代码:package sw.angel.thread...
    99+
    2023-05-31
    android 线程 roi
  • java高并发之线程组详解
    目录线程组创建线程关联线程组为线程组指定父线程组根线程组批量停止线程总结线程组 我们可以把线程归属到某个线程组中,线程组可以包含多个线程以及线程组,线程和线程组组成了父子关系,是个树...
    99+
    2024-04-02
  • Java多线程开发工具之CompletableFuture的应用详解
    做Java编程,难免会遇到多线程的开发,但是JDK8这个CompletableFuture类很多开发者目前还没听说过,但是这个类实在是太好用了,了解它的一些用法后相信你会对它爱不释手...
    99+
    2023-03-20
    Java CompletableFuture多线程开发 Java CompletableFuture使用 Java CompletableFuture
  • 详解C语言编程之thread多线程
    目录线程创建与结束线程的创建方式:线程的结束方式:join()detach()互斥锁<mutex> 头文件介绍std::mutex 介绍std::lock_guardst...
    99+
    2024-04-02
  • c# Thread类线程常用操作详解
    目录创建线程 管理线程 销毁线程 创建线程 线程是通过扩展 Thread 类创建的。扩展的 Thread 类调用 Start() 方法来开始子线程的执行。 下面的程序演示...
    99+
    2024-04-02
  • VB.NET开发多线程详细讲解
    这篇文章主要介绍“VB.NET开发多线程详细讲解”,在日常操作中,相信很多人在VB.NET开发多线程详细讲解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”VB.NET开发多线程详细讲解”的疑惑有所帮助!接下来...
    99+
    2023-06-17
  • C++ 多线程之互斥量(mutex)详解
    目录std::mutexstd::recursive_mutexstd::time_mutexstd::recursive_timed_mutexstd::shared_mutexs...
    99+
    2024-04-02
  • Java并发编程之LockSupport类详解
    目录一、LockSupport类的属性二、LockSupport类的构造函数三、park(Object blocker)方法 和 park()方法分析四、parkNanos(Obje...
    99+
    2024-04-02
  • Java并发编程之详解ConcurrentHashMap类
    前言 由于Java程序员常用的HashMap的操作方法不是同步的,所以在多线程环境下会导致存取操作数据不一致的问题,Map接口的另一个实现类Hashtable 虽然是线程安全的,但是...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作