
简介
1. 了解多线程
2. 线程同步和线程同步
3. 创建多线程应用程序
3.1通过System.Threading名称空间构造类
3.1.1异步调用线程
3.1.2并发问题
3.1.3线程同步
3.2通过委派构建多线程应用程序
3.2.1异步线程

3.2.2线程同步
3.3BackgroundWorker组件
4. 摘要
简介
随着双核,四核和其他多核处理器的推广,具有多核处理器或超线程单核处理器的计算机变得很普遍,并且基于多核处理的编程技术也已普及. 开始受到程序员的广泛关注. 这方面的重要方面之一是构建多线程应用程序(由于不使用多线程,开发人员无法充分发挥多核计算机的强大性能).
本文旨在基于单核计算机构建多线程应用程序. 目的是介绍与多线程相关的基本概念和内涵,以及如何通过System.Threading命名空间类,委托和BackgroundWorker组件的三种方法进行构建. 多线程应用程序.
如果您可以在介绍多线程新手朋友方面发挥作用,那么本文将是令人满意的. 当然,我的才华很浅,文本中不可避免地会存在缺陷或错误. 我真诚地向大家征求意见.
1. 了解多线程
我们通常理解的应用程序是* .exe文件. 当* .exe应用程序运行时,系统将在内存中为该程序分配一定数量的空间,并加载该程序所需的某些资源. 实际上,这可以称为创建过程. 您可以通过Windows任务管理器查看此进程的相关信息,例如映像名称,用户名,内存使用情况,PID(唯一进程标识)等,如下图所示.

线程只是进程中的基本执行单元. 一个应用程序通常只有一个程序条目,例如:
[STAThread]
static void Main()//应用程序主入口点
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(新的MainForm());
}
该过程将包含一个进入该条目的线程c#对windows 窗体控件进行线程安全调用,我们称它为主线程. 其中,[STAThread]功能指示应用程序的默认线程模型是单线程单元(有关相关信息,请参阅(VS.71).aspx). 仅包含一个主线程的进程是线程安全的,这等效于仅包含一个工作行的程序. 只有完成之前的任务后,才能执行排名靠后的任务.
但是,当程序处理非常耗时的任务(例如输出大文件或远程访问)时,此时的窗口界面程序基本上似乎对用户,菜单,按钮等无响应. 不使用它. 由于窗体上控件的响应事件也需要主线程执行,并且主线程正忙于做其他事情,因此控件响应事件只能排队等待主线程忙后再执行.
为了克服单线程的缺陷,Win32 API允许主线程创建其他辅助线程,但是主线程和辅助线程都是该过程中的独立执行单元,并且可以同时访问共享数据. 多线程的概念.
相信这一点,您应该对多线程有更多的感知理解. 但是我想在这里提醒一下,基于单核计算机的多线程实际上只是对操作系统视而不见(但这不会干扰我们对构建多线程应用程序的想法的理解). 无法缩短完成所有任务的时间有时,由于使用太多线程,可能会降低性能并延长时间. 原因是对于单个CPU,在单位时间内(也称为时间片),只能执行一个线程,即只能执行一件事情. 当线程的时间片用完时,系统将挂起该线程并在下一次执行另一个线程. 这样,CPU以时间片间隔交替执行多个线程之间的操作. (每个线程的优先级是相关的,更高的级别将首先被处理). 由于备用时间间隔非常短,因此会导致每个线程“同时”工作的错觉. 如果线程过多,则由于系统挂起了线程,因此必须记录线程的当前状态数据,等等. 总体性能. 但是对于这些,多核计算机可以实质上(确实同时工作)提高程序执行效率.
2. 线程同步和线程同步
线程执行任务的方式可以分为线程同步和线程异步. 为了便于理解,在下面的描述中,“同步线程”用于表示与线程同步相关的线程,类似地,“异步线程”用于表示与线程异步相关的线程.
线程异步是为了解决执行上述耗时任务时无法使用接口控件的问题. 例如,创建一个辅助线程来专门执行耗时的任务,并将其他任务(例如接口控制响应)移交给另一个线程执行(通常由主线程执行). 这样,通过线程调度程序在两个线程之间进行的短时(时间片)切换可模拟“同时”执行多个任务的效果.
线程异步通常是通过创建多个线程来执行多个任务来执行的,同时启动多个工作线,这类似于在宽阔的道路上同时向前行驶的多辆并行汽车,而不会互相干扰(读者应该理解从本质上讲,没有“同时”只是操作系统的一种盲目方法,但是这种盲目方法对于改善我们的程序与用户之间的交互以及提高程序的友好性非常有用. 是吗?
在介绍线程同步之前,首先介绍一个密切相关的概念并发问题.
如前所述,线程是独立的执行单元,可以访问共享数据. 换句话说,在具有多个辅助线程的程序中,每个线程可以访问相同的共享数据. 如果您考虑了一会儿,您会发现这可能会引起问题: 因为线程调度器将随机中止某个线程(在较早引入的线程之间进行切换),而当线程a访问共享数据D(修改,删除等)时. )操作)在完成之前被挂起,此时线程b恰巧访问数据D,然后线程b访问不稳定的数据. 这样c#对windows 窗体控件进行线程安全调用,很难发现错误. 由于它们是随机发生的,因此结果是不可预测的. 这些错误也很难重现和调试. 这是并发问题.
为了解决在多个线程访问共享资源(也称为互斥访问)时发生的并发问题,出现了线程同步. 简而言之,线程同步机制是防止多个线程同时访问共享资源. 该方法非常简单. 标记代码中访问共享资源的部分. 当程序运行到标记的位置时,CLR(只要知道它可以被控制,就可以忽略具体细节)调整每个线程: 如果已经有线程在访问资源时,CLR将挂起其他线程线程访问资源,直到前一个线程结束对资源的访问. 这样可以确保一次只有一个线程访问资源. 例如,如果将资源放置在由单个木桥连接的孤立岛上,则要使用该资源,每个人都必须逐一排队,上一个回来,下一个再次走,前一个不回来,后一个当场待命.
这里是基本概念和原理的简要说明,因此当我看下面的程序时,我不会感到困惑. 具体如何编写代码,以下段落将做详细介绍.
3. 创建多线程应用程序
这里是一个简短的解释: 下面主要介绍三种不同的方法,通过System.Threading命名空间类,委托和BackgroundWorker组件来构建多线程应用程序,特别是从线程异步和线程同步这两个方面进行阐述.
3.1通过System.Threading名称空间构造类
在.NET平台下,System.Threading命名空间提供了许多类型来构建多线程应用程序,可以说它们是专门为多线程服务设计的. 由于本文只是想扮演“丢砖引玉”的角色,因此对于本文,我不会讨论得太多或太深入,主要使用System.Threading.Thread类.
从一个与System.Threading.Thread类本身有关的小示例开始,代码如下,并在注释中说明了解释:
使用系统;
使用System.Threading; //介绍System.Threading命名空间
命名空间多线程
{
班级班级
{
static void Main(字符串[]参数)
{
Console.WriteLine(“ **************显示有关当前线程的信息*************”);
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-174276-1.html
多少算是低收入