C#多线程编程(整理)

C#经典面试题100道 1. .NET和C#有什么区别 答:.NET一般指 .NET FrameWork框架,它是一种平台,一种技术。 C#是一种编程语言,可以基于.NET平台的应用。 2.一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少,用递归算法实现。 答:pub... 阅读详情

 

Donet基础类库的System.Threading命名空间提供了大量的类和接口支持多线程。这个命名空间有很多的类,下面是Thread的资料。

        System.Threading.Thread类是用来创建并控制线程,设置其优先级并获取其状态最为常用的类。他有很多的方法,在这里我们将就比较常用和重要的方法做一下介绍:

 

  Thread.Start():启动线程的执行;

 

  Thread.Suspend():挂起线程,或者如果线程已挂起,则不起作用;

 

  Thread.Resume():继续已挂起的线程;

 

  Thread.Interrupt():中止处于 Wait或者Sleep或者Join 线程状态的线程;

 

  Thread.Join():阻塞调用线程,直到某个线程终止时为止

 

  Thread.Sleep():将当前线程阻塞指定的毫秒数;

 

  Thread.Abort():以开始终止此线程的过程。如果线程已经在终止,则不能通过Thread.Start()来启动线程。

 

 

        通过调用Thread.Sleep,Thread.Suspend或者Thread.Join可以暂停/阻塞线程。调用Sleep()和Suspend()方法意味着线程将不再得到CPU时间。这两种暂停线程的方法是有区别的,Sleep()使得线程立即停止执行,但是在调用Suspend()方法之前,公共语言运行时必须到达一个安全点。一个线程不能对另外一个线程调用Sleep()方法,但是可以调用Suspend()方法使得另外一个线程暂停执行。对已经挂起的线程调用Thread.Resume()方法会使其继续执行。不管使用多少次Suspend()方法来阻塞一个线程,只需一次调用Resume()方法就可以使得线程继续执行。已经终止的和还没有开始执行的线程都不能使用挂起。Thread.Sleep(int x)使线程阻塞x毫秒。只有当该线程是被其他的线程通过调用Thread.Interrupt()或者Thread.Abort()方法,才能被唤醒。

 

  如果对处于阻塞状态的线程调用Thread.Interrupt()方法将使线程状态改变,但是会抛出ThreadInterupptedException异常,你可以捕获这个异常并且做出处理,也可以忽略这个异常而让运行时终止线程。在一定的等待时间之内,Thread.Interrupt()和Thread.Abort()都可以立即唤醒一个线程。

 

  下面我们将说明如何从一个线程中止另外一个线程。在这种情况下,我们可以通过使用Thread.Abort()方法来永久销毁一个线程,而且将抛出ThreadAbortException异常。使终结的线程可以捕获到异常但是很难控制恢复,仅有的办法是调用Thread.ResetAbort()来取消刚才的调用,而且只有当这个异常是由于被调用线程引起的异常。因此,A线程可以正确的使用Thread.Abort()方法作用于B线程,但是B线程却不能调用Thread.ResetAbort()来取消Thread.Abort()操作。

 

  Thread.Abort()方法使得系统悄悄的销毁了线程而且不通知用户。一旦实施Thread.Abort()操作,该线程不能被重新启动。调用了这个方法并不是意味着线程立即销毁,因此为了确定线程是否被销毁,我们可以调用Thread.Join()来确定其销毁,Thread.Join()是一个阻塞调用,直到线程的确是终止了才返回。但是有可能一个线程调用Thread.Interrupt()方法来中止另外一个线程,而这个线程正在等待Thread.Join()调用的返回。

        尽可能的不要用Suspend()方法来挂起阻塞线程,因为这样很容易造成死锁。假设你挂起了一个线程,而这个线程的资源是其他线程所需要的,会发生什么后果。因此,我们尽可能的给重要性不同的线程以不同的优先级,用Thread.Priority()方法来代替使用Thread.Suspend()方法。

 

  Thread类有很多的属性,这些重要的属性是我们多线程编程必须得掌握的。

 

  Thread.IsAlive属性:获取一个值,该值指示当前线程的执行状态。如果此线程已启动并且尚未正常终止或中止,则为 true;否则为 false。

 

  Thread.Name 属性:获取或设置线程的名称。

 

  Thread.Priority 属性:获取或设置一个值,该值指示线程的调度优先级。

  Thread.ThreadState 属性:获取一个值,该值包含当前线程的状态。

  在下面的例子中,我们将看看怎么设置这些属性,在随后的例子中我们将详细的讨论这些属性。

  创建一个线程,首先得实例化一个Thread类,在类得构造函数中调用ThreadStart委派。这个委派包含了线程从哪里开始执行。当线程启动后,Start()方法启动一个新的线程。下面是例子程序。

using System;

using System.Threading ;

namespace LearnThreads

{

class Thread_App

{

public static void First_Thread()

{

 Console.WriteLine("First thread created");

 Thread current_thread = Thread.CurrentThread;

 string thread_details = "Thread Name: " + current_thread.Name + "/r/nThread State: " + current_thread.ThreadState.ToString()+"/r/n Thread Priority level:"+current_thread.Priority.ToString();

 Console.WriteLine("The details of the thread are :"+ thread_details);

 Console.WriteLine ("first thread terminated");

}

 

public static void Main()

{

 ThreadStart thr_start_func = new ThreadStart (First_Thread);

 Console.WriteLine ("Creating the first thread ");

 Thread fThread = new Thread (thr_start_func);

 fThread.Name = "first_thread";

 fThread.Start (); //starting the thread

}

}

 

 

 

多线程在.NET里如何工作?

 

  在本质上和结构来说,.NET是一个多线程的环境。有两种主要的多线程方法是.NET所提倡的:使用ThreadStart来开始你自己的进程,直接的(使用ThreadPool.QueueUserWorkItem)或者间接的(比如Stream.BeginRead,或者调用BeginInvoke)使用ThreadPool类。一般来说,你可以"手动"为长时间运行的任务创建一个新的线程,另外对于短时间运行的任务尤其是经常需要开始的那些,进程池是一个非常好的选择。进程池可以同时运行多个任务,还可以使用框架类。对于资源紧缺需要进行同步的情况来说,它可以限制某一时刻只允许一个线程访问资源。这种情况可以视为给线程实现了锁机制。线程的基类是System.Threading。所有线程通过CLI来进行管理。

 

  ·创建线程:

 

  创建一个新的Thread对象的实例。Thread的构造函数接受一个参数:

 

Thread DummyThread = new Thread( new ThreadStart(dummyFunction) );

 

  ·执行线程:

 

  使用Threading命名空间里的start方法来运行线程:

 

DummyThread.Start ();

 

  ·组合线程:

 

  经常会出现需要组合多个线程的情况,就是当某个线程需要其他线程的结束来完成自己的任务。假设DummyThread必须等待DummyPriorityThread来完成自己的任务,我们只需要这样做:

 

DummyPriorityThread.Join() ;

 

  ·暂停线程:

 

  使得线程暂停给定的秒

 

DummyPriorityThread.Sleep(<Time in Second>);

 

  ·中止线程:

 

  如果需要中止线程可以使用如下的代码:

 

DummyPriorityThread.Abort();

 

  ·同步

 

  经常我们会遇到需要在线程间进行同步的情况,下面的代码给出了一些方法:

 

using System;using System.Threading;namespace SynchronizationThreadsExample{

 class SynchronizationThreadsExample{

  private int counter = 0;

  static void Main( ) {

   SynchronizationThreadsExample STE = new SynchronizationThreadsExample();

   STE.ThreadFunction( );

  }

  public void ThreadFunction ( ) {

   Thread DummyThread = new Thread( new ThreadStart(SomeFunction) ;

   DummyThread.IsBackground=true;

   DummyThread.Name = "First Thread";

   DummyThread.Start( );

   Console.WriteLine("Started thread {0}", DummyThread.Name);

   Thread DummyPriorityThread = new Thread( new ThreadStart(SomeFunction) );

   DummyPriorityThread.IsBackground=true;

   DummyPriorityThread.Name = "Second Thread";

   DummyPriorityThread.Start( );

   Console.WriteLine("Started thread {0}", DummyPriorityThread.Name);

   DummyThread.Join( );

   DummyPriorityThread.Join( );

  }

  public void SomeFunction( ) {

   try {

    while (counter < 10) {

     int tempCounter = counter;

     tempCounter ++;

     Thread.Sleep(1);

     counter = tempCounter;

     Console.WriteLine( "Thread {0}. SomeFunction: {1}",Thread.CurrentThread.Name, counter);

    }

   }

   catch (ThreadInterruptedException Ex) {

    Console.WriteLine( "Exception in thread {0} ", Thread.CurrentThread.Name);

   }

   finally {

    Console.WriteLine( "Thread {0} Exiting. ",Thread.CurrentThread.Name);

   }

  }

 }

}

 

  ·使用Interlock

 

  C#提供了一个特殊的类叫做interlocked,就是提供了锁机制的实现,我们可以加入如下的代码实现锁机制:

 

Interlocked.SomeFunction (ref counter);

 

  ·使用锁

 

  这是为了锁定代码关键区域以进行同步,锁定代码如下:

 

lock (this){ Some statements ;}

 

  ·使用Monitor

 

  当有需要进行线程管理的时候我们可以使用:

 

Monitor.Enter(this);

 

  其他也有一些方法进行管理,这里就不一一提及了。

C#100道经典面试题 C#100道经典面试题 .NET和C#有什么区别 答:.NET一般指 .NET FrameWork框架,它是一种平台,一种技术。 C#是一种编程语言,可以基于.NET平台的应用。 2.一列数的规则如下: 1、1、2、3、5、8、13、21、34… 求第30位数是多少,用递归算法实现。 答:public class MainClass { public static void Main() { Console.WriteLine(Foo(30)); } public static int Foo(int 阅读详情

相关推荐

【AUCell打分】:评估一个基因集在单细胞转录组的每个细胞中特定的活性程度

AUCell使用曲线下面积来计算输入基因集的一个有意义的基因子集是否在每个细胞的表达基因中富集。AUC 分数在所有细胞中的分布允许探索特征的相对表达。由于评分方法是基于排名的,因此 AUCell 与基因表达单位和归一化程序无关。此外,由于细胞是单独评估的,因此可以很容易地应用于更大的数据集。

weixin_40695088的博客 1万+

C# 多线程 & 异步编程知识体系整理

C# 多线程与异步编程知识体系涵盖了线程基础、线程操作、异步编程核心、同步机制、常见误区及扩展工具。线程是操作系统独立运行的最小单位,多线程适用于批量任务并行处理和多任务独立运行。线程池通过预创建线程减少开销,线程安全通过同步机制和原子操作实现。线程操作包括创建、终止、挂起/恢复,并发控制工具包括传统锁机制和轻量级同步。异步编程核心包括Task模型、方法声明、异步控制流(取消机制、超时处理)。同步机制与并发控制涉及线程安全组件和异步锁策略。常见误区包括异步不等于多线程、Task.Result不总会阻塞、aw

qq_36298692的博客 749

遥感图像处理实战:DOTA数据集旋转框转YOLO格式全流程解析(附代码)

本文详细解析了将DOTA遥感数据集的旋转框标注转换为YOLO格式的全流程。针对遥感图像中物体朝向任意性的特点,文章重点阐述了将旋转框转换为外接水平框的数学原理与代码实现,并提供了批量转换脚本和可视化验证方法,帮助开发者高效处理数据,为基于YOLO的遥感目标检测项目奠定基础。

weixin_29082143的博客 398

C# 多线程&异步编程 笔记整理

C# 中的多线程和异步编程是提高应用程序性能和响应能力的关键技术。多线程允许程序同时执行多个任务,适用于 CPU 密集型操作,而异步编程则通过不阻塞线程来提高效率,特别适合 IO 密集型任务。线程池的使用可以减少线程创建和销毁的开销,而线程安全则通过同步机制和原子操作来确保数据一致性。异步编程通过 async 和 await 关键字实现,允许任务在后台执行而不阻塞主线程。任务取消和超时处理是异步编程中的重要概念,而同步上下文则帮助管理线程切换。理解这些概念和工具对于编写高效、可靠的 C# 应用程序至关重要。

qq_36298692的博客 778

基于AR和SLAM技术的商场智能导视系统技术原理详解

本文针对智慧商场室内导航需求,提出基于AR和SLAM技术的商场智能导视系统技术方案,实现了沉浸式导览体验并促进消费转化,助力商场运营升级。

维小帮定位导航的博客 1243

神经网络基础概念总结(小白入门自用)

神经网络人工神经网络多层感知机激活函数反向传播算法损失函数权值初始化正则化方法 人工神经网络 人工神经元:人工神经元是人工神经网络的基本单元。模拟生物神经元,人工神经元有1个或者多个输入(模拟多个树突或者多个神经元向该神经元传递神经冲动);对输入进行加权求和(模拟细胞体将神经信号进行积累和树突强度不同);对输入之和使用激活函数计算活性值(模拟细胞体产生兴奋或者抑制);输出活性值并传递到下一个人工神经元(模拟生物神经元通过轴突将神经冲动输入到下一个神经元)。 人工神经网络:大量的人工神经元以某种链接方式得来的

qq_42011158的博客 648

《C#多线程编程实战》读书笔记

本文是一篇读书笔记,由《C#多线程编程实战》一书中的内容整理而来,主要梳理了.NET中多线程编程相关的知识脉络,从Thread、ThreadPool、Task、async/await、并发集合、Parallel、PLINQ到Rx及异步I/O等内容,均有所覆盖。为了帮助大家理解本文内容,首先给出博主在阅读该书过程中绘制的思维导图,大家可以根据个人需要针对性的查漏补缺。 线程基础 Tips1

素履独行 | 元培的个人博客 6839

课题申报书成功率提升85%!借助大模型AI精准选题、搭综述框架及提炼创新点(附实操AI提示词)

写一份高质量的课题申报书往往面临许多困难,对很多同仁来说,难就难在:选题既要新又要能落地,文献综述要结构清晰还得有观点,研究目标要写得有逻辑还不能夸大,创新点必须得新。而且就算你有思路,也卡在怎么组织语言,怎么压缩字数上。现在我们用ChatGPT等AI工具,可以帮我们从“选题策划 → 综述撰写 → 目标拆解 → 创新提炼 → 团队结构”实现申报工作的全流程,我们要做的就是设计好提示词和收集相关资料。这篇文章将会从申报工作的六个核心模块出发,并给出参考AI提示词,帮你快速提升课题申报效率。

智能AI让学术科研更容易 907

C多线程70样例源代码

C#多线程70样例源代码 去发现同类优质开源项目:https://gitcode.com/ 介绍 本仓库包含了70个C#多线程编程的样例源代码,是学习C#多线程编程的宝贵资源。这些源代码旨在帮助开发者深入理解多线程的概念、原理以及实际应用,从而提升编程技能。 描述 这些C#多线程源代码经过精心整理,内容丰富且实用。通过共同学习和研究,可以更好地掌握多线程编程的技巧,同时积分的增加也会激励大家更积极...

gitblog_06796的博客 303

FANUC机器人S523 新款PN板卡与西门子PLC通信配置介绍

FANUC机器人S523 新款PN板卡与西门子PLC通信配置介绍

Robot_PLC_HMI_Automation 354

别再无脑调打码平台了!聊聊 ddddocr 在爬虫验证码识别中的真实边界

ddddocr是国产开源社区的优秀成果,它大幅降低了验证码识别的入门门槛。工具的自由不等于工程的自由。真正的能力不在于“会不会调库”,而在于能否准确判断工具的适用边界、构建鲁棒的容错机制、并在成本与效果之间做出理性权衡。下次当你准备在爬虫中加入验证码识别时,不妨先问自己:这个站点的验证码类型是否在ddddocr的能力圈内?我的预处理是否针对该站点做过专项调试?我的失败重试和监控机制是否完备?如果三个问题都能肯定回答,那么ddddocr就是你的利器;如果有任何一个犹豫,请先补齐短板再上路。评论区交流:你用。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1281

C#多线程系列

个人感觉C#的编程,除了对算法和类库的使用以外,达到一定的水平以后,多线程的使用将会成为一个很大的瓶颈。所以重新花费时间读了一本书:《.net 4.0面向对象编程漫谈(应用篇)》里面关于多线程的描述。自己做了一个读书笔记,把多线程部分的要点进行了梳理,并且适当的加上了一些自己的测试和理解。整理出来,作为一个摘要,以便自己和同事们拿出来学习和使用。同时希望各位博友进行论证,大家一起学习和进步。 ...

技术专栏 2182

【ROS2】从yaml文件中读取参数配置

ROS2:从yaml中读取参数,到节点;使用C++演示参数的增、删、改、查、遍历、监听变化

郭老二 1284

C#相关图书推荐

C#入门经典(第6版) 作者 [美] Karli Watson,Jacob Vibe Hammer,Jon D Reid 等 著; 出版社 清华大学出版社 出版时间 2014-01-01 版次 6 页数 868 印刷时间 2014-01-01 开本 16开 纸张 胶版...

weixin_30950237的博客 249

OV9734 DATASHEET,完整规格书

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

计算机控制技术及应用

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

100道C#高频经典面试题及答案解析:C#程序员面试题库分类总结

100道C#高频经典面试题及答案解析:C#程序员面试题库分类总结

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 1983

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

编程综合资源(我的收集)

(1) 优秀的资料网站、博客、BBS http://tech.ddvip.com/program/delphi/index.html    ddvip.com,丰富的编程教程 http://www.cnblogs.com/yuanbao/category/110151.html   元宝家园,博客 http://hi.baidu.com/delphidiary/blog/item/c5c8537...

weixin_33889245的博客 135

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

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

.Net 面试题整理(一)

.Net 面试题整理(一) 好久的资料了,拿出来分享给大家,主要是记录一些面试题整理。 Main函数是什么?在程序中使用Main函数有什么需要注意的地方? Q:程序的入口函数!函数名字不能改变;一个程序中有且只有一个Main函数。 CLR是什么?程序集是什么?当运行一个程序集的时候,CLR做了什么事情? Q:Common Language RunTime 公共语言运行时。 ...

fuchenxuan blog 415

[转载]C# WinForm开发系列 - 文章索引

 该系列主要整理收集在使用C#开发WinForm应用文章及相关代码, 平时看到大家主要使用C#来开发Asp.Net应用,这方面的文章也特别多,而关于WinForm的文章相对少很多,而自己对WinForm一直比较感兴趣,这几年积累收藏了不少文章,现在整理一下分类推荐给大家,避免大家浪费大把的时间去找这方面的资料,因为找资料也是一件很累的事情,Google,Baidu一下,不断的点击,不断翻阅大量的博

fsyiyun的专栏 822

[转载来的]C# API 大全

 C# APIC:/ProgramFiles/MicrosoftVisual Studio .NET/ FrameworkSDK/Samples/ Technologies/ Interop/PlatformInvoke/ WinAPIs/CS目录下有大量的调用API的例子。一、调用格式using System.Runtime.InteropServices; //引用此名称空间,简化后面的代码/

624

C#面试题收集一(125题)

吃了几次知识点不够全面的亏,特意从网上收集了C#大部分的面试题,方便自己以后翻阅,大家也都不用到处去找了1.维护数据库的完整性、一致性、你喜欢用触发器还是自写业务逻辑?为什么?答:尽可能用约束(包括CHECK、主键、唯一键、外键、非空字段)实现,这种方式的效率最好;其次用触发器,

何涛(点滴汇聚终成大海) 1369
上一篇: ArcGIS Server中的各种服务
下一篇: C#中的DllImport
evilmojo
博客等级 码龄18年 16粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值