如何:创建和终止线程(C# 编程指南)

深入刨析:C#线程优雅终止与窗体安全退出! 在当今软件开发领域,C#语言以其强大的功能和灵活性广受欢迎,尤其是在多线程编程方面。多线程编程能够提高程序的执行效率和响应速度,但同时也带来了线程管理和资源同步的挑战。 阅读详情

转:http://msdn.microsoft.com/zh-cn/library/7a2f3ay4.aspx

 今天遇到一个问题,看了这篇文章解决了。

问题:怎样结束指定的某个线程。

解决办法:我先把它存入 Dictionary<String, Thread>,然后按key取出,再调用Abort 从另一个线程中终止某个线程。

 


此示例演示如何创建辅助线程,并用它与主线程并行执行处理。还将演示如何使一个线程等待另一个线程,并正确地终止线程。有关多线程处理的背景信息,请参见托管线程处理和使用线程处理(C# 编程指南)。

该示例创建一个名为 Worker 的类,该类包含辅助线程将执行的方法 DoWork。这实际上是辅助线程的 Main 函数。辅助线程将通过调用此方法来开始执行,并在此方法返回时自动终止。DoWork 方法如下所示:

C#
public void DoWork()
{
    while (!_shouldStop)
    {
        Console.WriteLine("worker thread: working...");
    }
    Console.WriteLine("worker thread: terminating gracefully.");
}


Worker 类包含另一个方法,该方法用于通知 DoWork 它应当返回。此方法名为RequestStop,如下所示:

C#
public void RequestStop()
{
    _shouldStop = true;
}


RequestStop 方法只是将 true 赋给_shouldStop 数据成员。由于此数据成员由DoWork 方法来检查,因此这会间接导致DoWork 返回,从而终止辅助线程。但是,您应当注意:DoWork 和RequestStop 将由不同线程执行。DoWork 由辅助线程执行,而RequestStop 由主线程执行,因此 _shouldStop 数据成员声明为volatile,如下所示:

C#
private volatile bool _shouldStop;


volatile 关键字用于通知编译器,将有多个线程访问_shouldStop 数据成员,因此它不应当对此成员的状态做任何优化假设。有关更多信息,请参见volatile(C# 参考)。

通过将 volatile 与 _shouldStop 数据成员一起使用,可以从多个线程安全地访问此成员,而不需要使用正式的线程同步技术,但这仅仅是因为 _shouldStop 是 bool。这意味着只需要执行单个原子操作就能修改_shouldStop。但是,如果此数据成员是类、结构或数组,那么,从多个线程访问它可能会导致间歇的数据损坏。假设有一个更改数组中的值的线程。Windows 会定期中断线程,以便允许其他线程执行。因此,此线程会在分配某些数组元素之后和分配其他元素之前被停止。由于数组现在有了一个程序员从不想要的状态,因此,读取此数组的另一个线程可能会失败。

在实际创建辅助线程之前,Main 函数会创建一个 Worker 对象和Thread 的一个实例。线程对象被配置为:通过将对Worker.DoWork 方法的引用传递给Thread 构造函数,来将该方法用作入口点,如下所示:

C#
Worker workerObject = new Worker();
Thread workerThread = new Thread(workerObject.DoWork);


此时,尽管辅助线程对象已存在并已配置,但尚未创建实际的辅助线程。只有当 Main 调用 Start 方法后,才会创建实际的辅助线程:

C#
workerThread.Start();


此时,系统将启动辅助线程的执行,但这是在与主线程异步执行的。这意味着 Main 函数将在辅助线程进行初始化的同时继续执行代码。为了确保Main 函数不会尝试在辅助线程有机会执行之前将它终止,Main 函数将一直循环,直到辅助线程对象的IsAlive 属性设置为true:

C#
while (!workerThread.IsAlive);


下一步,通过调用 Sleep 来将主线程停止片刻。这确保了辅助线程的DoWork 函数在Main 函数执行其他任何命令之前,在DoWork 方法内部执行若干次循环:

C#
Thread.Sleep(1);


在 1 毫秒之后,Main 将通知辅助线程对象,它应当使用 Worker.RequestStop 方法(前面已介绍)自行终止:

C#
workerObject.RequestStop();


还可以通过调用 Abort 从另一个线程中终止某个线程。这将强行终止受影响的线程,即使该线程尚未完成其任务,并且未提供清理资源的机会。此示例中显示的技术是首选方法。

最后,Main 函数对辅助线程对象调用 Join 方法。此方法导致当前线程阻塞或等待,直到对象所表示的线程终止。因此,直到辅助线程返回后,Join 才会返回,然后自行终止:

C#
workerThread.Join();


此时,只有执行 Main 的主线程还存在。它会显示一条最终消息,然后返回,从而使主线程也终止。

下面是完整的示例。

C#
using System;
using System.Threading;

public class Worker
{
    // This method will be called when the thread is started.
    public void DoWork()
    {
        while (!_shouldStop)
        {
            Console.WriteLine("worker thread: working...");
        }
        Console.WriteLine("worker thread: terminating gracefully.");
    }
    public void RequestStop()
    {
        _shouldStop = true;
    }
    // Volatile is used as hint to the compiler that this data
    // member will be accessed by multiple threads.
    private volatile bool _shouldStop;
}

public class WorkerThreadExample
{
    static void Main()
    {
        // Create the thread object. This does not start the thread.
        Worker workerObject = new Worker();
        Thread workerThread = new Thread(workerObject.DoWork);

        // Start the worker thread.
        workerThread.Start();
        Console.WriteLine("main thread: Starting worker thread...");

        // Loop until worker thread activates.
        while (!workerThread.IsAlive);

        // Put the main thread to sleep for 1 millisecond to
        // allow the worker thread to do some work:
        Thread.Sleep(1);

        // Request that the worker thread stop itself:
        workerObject.RequestStop();

        // Use the Join method to block the current thread 
        // until the object's thread terminates.
        workerThread.Join();
        Console.WriteLine("main thread: Worker thread has terminated.");
    }
}


输出如下:

other
main thread: starting worker thread...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: terminating gracefully...
main thread: worker thread has terminated
 
C#编程-实现线程 在带有轮询的事件循环方法中,单一线程以无限循环的方式运行,指导它的操作完成为止。例如,需要线程暂停一段时间以便线程被允许执行的时候,可以调用Thread.SLeep()方法。在上述代码中,使用Thread类的CurrentThread参数获得了当前线程的引用。使用一个线程执行的进程被称为单线程进程,这里进程是一个程序的运行实例。而且,不管对给定的线程调用多少次Thread.Suspend()方法,只要调用一次Thread.Resume()就可让线程继续执行。Thread类的Start()方法用于执行线程。 阅读详情

相关推荐

掌控多线程的命脉:C# 中线程启动、暂停与终止的终极实践

在现代应用程序开发中,如何有效地管理多线程是至关重要的。无论是处理大量并发请求、执行复杂计算,还是异步操作,多线程技术都能极大地提升程序的性能和响应能力。而在 C# 中,线程控制的实现,尤其是启动、暂停、恢复和终止,往往是开发者面对的难题之一。在这篇文章中,我们将深入探讨如何在 C# 中实现线程的精确控制,从而让你在开发中得心应手地“掌控多线程的命脉”。我们将通过具体示例展示如何实现线程的启动、暂停、继续与停止,并讨论常见的多线程控制技巧。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1194

注意!你的Thread.Abort方法真的让线程停止了吗?

大家都知道在C#里面,我们可以使用Thread.Start方法来启动一个线程,当我们想停止执行的线程时可以使用Thread.Abort方法来强制停止正在执行的线程,但是请注意,你确定调用了Thread.Abort方法后线程就立刻停止了吗?答案是:不是! 下面我们来解释一下Abort方法是如何工作的。因为公用语言运行时管理了所有的托管的线程,同样它能在每个线程内抛出异常。Abo...

4341

C#停止线程的方法

主要介绍了C#停止线程的方法,实例分析了C#正确停止线程的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下

C# Thread 线程的停止和恢复

/* 因为公用语言运行时管理了所有的托管的线程,同样它能在每个线程内抛出异常。Abort方法能在目标线程中抛出一个ThreadAbortException异常从而导致目标线程的终止。不过Abort方法被调用后,目标线程可能并不是马上就终止了。因为只要目标线程正在调用非托管的代码而且还没有返回的话,该线程就不会立即终止。而如果目标线程在调用非托管的代码而且陷入了一个死循环的话,该目标线程就根本不会终止。不过这种情况只是一些特例,更多的情况是目标线程在调用托管的代码,一旦Abort被调用那么该线程就立即终止..

zxcvb036的博客 1万+

自动驾驶仿真:python和carsim联合仿真案例

carsim内部有许多相关联合仿真的demo,simulink、labview等等都有涉及,这里简单介绍下python和carsim联合仿真的方法,虽然carsim官方有个Steer_Control.py相关的案例,但是感觉比较冗余,这里抽出重点部分和大家交流探讨下。提示:以下是本篇文章正文内容,下面案例可供参考1、这里关于solvers的细节其实都没说,因为里面确实也没什么内容好讲的,本质就是调用carsim.dll,如果你需要更多的函数解析其实可以看vs_api.h,路径在,具体内容如下图所示。

zataji的博客 9060

UR5双臂Gazebo仿真(Python)

近来在Gazebo上搭了一个ur5双臂仿真平台。 差不多就是以下这样。 使用rostopic list查看一下话题,如下 显然,采用/left_arm_controller/follow_joint_trajectory/goal和/right_arm_controller/follow_joint_trajectory/goal两个话题来控制双臂的运动。 现在的问题是,如何保证双臂运动的一致性,即如何能保证双臂能同时接受到以上两个消息。 思路一:设置/left_arm_controlle

qq_42823342的博客 2233

C#中断执行的四种方式

目录 中断执行的四种方式 continue 代码 执行效果 break 代码 效果 有关中断执行的注意点 中断执行的四种方式 continue :立即终止当前的循环(继续执行下一次循环) break :立即终止循环,继续执行循环后面的第一行代码 goto :可以跳出循环,到已标记好的位置上 return:跳出包含其的函数 相同语句但是中断执行的方式不一样,会出现不同的效果。 continue 代码 using System; namespace ConsoleA.

二琳爱吃肉的博客 7441

Excel药品说明书数据库:从零开始搭建医药数据查询系统(附完整模板)

本文详细介绍了如何从零开始搭建Excel药品说明书数据库,提供完整的医药数据查询系统模板。涵盖数据库架构设计、数据清洗标准化、智能查询系统搭建及维护优化,帮助医药从业者高效管理药品信息,提升查询速度和准确性。

weixin_28327051的博客 233

终止线程的三种方法

有三种方法可以使终止线程。    1.  使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。    2.  使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。    3.  使用interr

涑飏的专栏 9万+

GD32F303片内FLASH实战:从地址映射到数据持久化存储

本文详细介绍了GD32F303片内FLASH的实战应用,从地址映射到数据持久化存储的全过程。通过解析FLASH的基础特性、安全操作区域规划、擦除写入读取的三重奏操作,以及工程化进阶技巧,帮助开发者高效利用片内FLASH进行数据存储。文章还提供了调试技巧和常见问题解决方案,特别适合嵌入式开发者在实际项目中应用。

weixin_26742753的博客 214

libero烧录信号抓取

提示:如果改了东西需要重新烧录,需要把这两个界面都关闭再libero打开。两个红色的要关闭掉。然后返回libero开始烧录,观测信号(如果只烧录观测从这一步开始就行)等到下面的messige出现以下信息表示run好了。在下图中右侧可以自己设置,设置完之后记得保存一下。run一下,耐心等待,有警告就ok,run完之后。run成功会变绿色,然后点下面的这个看波形。设置抓取信号:在libero打开。打开的就是烧录界面,直接run。

qq_34047965的博客 1420

C#多线程编程:使用Thread类启动与优雅停止线程指南

首先需要定义一个方法,该方法将包含线程执行时要运行的代码。这个方法应该没有返回值(即。

学习和分享 997

LVGL在RTOS下的线程安全实践:从卡死到流畅的界面切换

本文探讨LVGL在RTOS环境下的线程安全实践,重点分析FreeRTOS多任务同步机制,包括互斥锁、任务通知和消息队列方案。通过实际案例展示如何避免界面卡顿和系统死锁,实现从卡死到流畅的界面切换,为嵌入式GUI开发提供可靠的适配解决方案。

uran的专栏 1111

如何:创建和终止线程(C# 编程指南--MSDN)

此示例演示如何创建辅助线程,并用它与主线程并行执行处理。还将演示如何使一个线程等待另一个线程,并正确地终止线程。有关多线程处理的背景信息,请参见托管线程处理和使用线程处理(C# 编程指南)。 该示例创建一个名为 Worker 的类,该类包含辅助线程将执行的方法 DoWork。这实际上是辅助线程的 Main 函数。辅助线程将通过调用此方法来开始执行,并在此方法返回时自动终止。DoWork 方法如下...

weixin_30708329的博客 104

Android System UI 深度解析:从架构演进到车载 / TV 场景的全维度定制

本文全面解析 Android System UI 的架构设计、功能演进及场景化定制,揭示其作为安卓系统核心交互层的技术特性与生态价值。

学无止境 1578

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C#:多线程和线程池

一、基本概念 1. 基础   Windows系统是一个多线程的操作系统。         一个程序至少有一个进程,一个进程至少有一个线程。         进程是线程的容器,一个C#客户端程序开始于一个单独的线程,CLR(公共语言运行库)为该进程创建了一个线程,该线程称为主线程。例如当我们创建一个C#控制台程序,程序的入口是Main()函数,Main()函数是始于一个主线程的。它的功能主要...

SSS_369 6493

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C# 多线程编程完全指南:从基础到高级应用

多线程编程是现代开发中不可或缺的一部分,它可以显著提高程序的执行效率和响应能力。C# 提供了多种线程管理和同步机制,如Thread类、lockMonitor和Mutex,它们能够帮助开发者应对多线程编程中的常见问题,如数据竞争和死锁。通过合理使用线程池和异步编程模型,开发者可以更高效地处理并发任务,提高程序的性能和稳定性。在实际应用中,合理选择同步机制、合理设计线程管理策略、避免死锁和竞态条件,是编写高效、稳定的多线程程序的关键。

net core ,前端 ,python 全栈开发 1476

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C# 多线程实战指南:从线程创建到管理与终止

本文介绍了C#中多线程编程的核心技术,重点讲解了三种线程创建方式(Thread类、带参数线程、Task任务)及其适用场景,详细说明了线程管理的关键技巧(等待线程、前后台线程、优先级设置、线程本地存储),并强调了线程终止的正确做法(避免强制终止,推荐使用布尔标志位或CancellationToken)。文章通过大量可运行的代码示例,帮助开发者掌握多线程编程的最佳实践,提升程序并发性能。

bugcome的博客 514

线程的概念、创建和终止

线程的概念、创建和终止

learning_ape的博客 561
上一篇: 一个不错的C# Telnet类库(改进了汉字显示乱码的问题)
下一篇: C#VS2008断点无效【解决办法】
cg_program
博客等级 码龄19年 245粉丝 147原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值