随笔分类 - C#
摘要:什么是lock语句?lock语句是设置锁定和解除锁定的一种简单方式。为什么使用lock语句?在使用多线程的过程中,会出现很多难以发现的问题,比如竞态条件与死锁,为了避免这些同步问题,所以使用lock语句,当然这并不是解决同步问题的唯一方法。lock语句的作用: lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。 如果其他线程尝试进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。lock语句的用法:lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。 此语句的形式如下:Object thisLock = new Ob
阅读全文
摘要:死锁多线程中,常见的一种问题除了竞态条件外就是死锁。那什么是死锁呢?死锁就是:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。那么为什么会产生死锁呢?1.因为系统资源不足。2.进程运行推进的顺序不合适。3.资源分配不当。学过操作系统的朋友都知道:产生死锁的条件有四个:1.互斥条件:所谓互斥就是进程在某一时间内独占资源。2.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。3.不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。4.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。死锁演示:为了演
阅读全文
摘要:竞态条件概述:如果两个或两个以上的线程同时访问相同的对象,或者访问不同步的共享状态.就会出现竞态条件。举例:如果多个线程同时访问类StateThread中的方法,最后结果会如何呢?定义一个类StateThread,它包含一个int字段mState和一个方法ChangeIntValue。在ChangeIntValue方法中,验证mState变量是否包含10,如果是,就增其值。在给5增值后mState变量的值应该是11,但是事实并不一定如此。例如,如果一个线程刚好运行到if(mState==10),就被其它线程抢先,调度器去运行另一个线程。 第二个线程进入If体,将mState值增加,即此时mSt
阅读全文
摘要:线程池 创建线程是需要时间的。许多应用程序使用多个线程,但这些线程经常在休眠状态中耗费大量的时间来等待事件发生。 为了简化对这些线程的管理,.NET框架为每一个进程提供了一个线程池,使应用程序能够根据需要来有效地利用多个线程。 线程池线程都是后台线程。每个线程都使用默认堆栈大小,以默认的优先级运行,并处于多线程单元中。 ThreadPool类会在需要时增减池中线程的个数,直到最大的线程数。线程的数目永远不会超过最大值。超过最大值的其他线程可以排队,但它们要等到其他线程完成后才启动。 池中的最大线程数是可配置的,也可以指定在创建线程池时立即启动的最小线程数。在双核CPU中,默认设置为50个工作线
阅读全文
摘要:前台线程和后台线程 线程默认为前台线程,这意味着任何前台线程在运行都会保持程序存活。 后台线程:只要有一个前台线程在运行,应用程序的进程就在运行。如果多个前台线程在运行,而Main()方法结束了,应用程序的进程就是激活的,直到所有前台线程完成其任务为止。 前台线程和后台线程的唯一的区别是— 后台线程不会阻止进程终止。 在默认情况下,用Thread 类创建的线程都是前台线程。线程池中的线程总是后台线程。 在用Thread类创建线程时,可以设置属性IsBackground,以确定该线程是(false)前台线程还是(true)后台线程。using System.Threading;namespace
阅读全文
摘要:Thread 类 使用Thread类可以创建和控制线程,Thread类有如下方法: Start():启动线程; Sleep(int):静态方法,暂停当前线程指定的毫秒数; Abort():通常使用该方法来终止一个线程; Suspend():该方法并不终止未完成的线程,它仅仅挂起线程,以后还可恢复; Resume():恢复被Suspend()方法挂起的线程的执行。 基本用法: 静态的方法:using System.Threading;namespace ConsoleApplication1{ class Program { public static void myStaticThreadMe
阅读全文
摘要:一.为什么使用线程 简单来讲,就是用线程来实现,在程序运行过程中,还可以同时执行其他操作。二.线程的概述 线程是程序中独立的指令流。使用C#编写任何程序时,都有一个入口:Main()方法。程序从Main()方法的第一条语句开始执行,直到这个方法返回为止。 在.net framework class library中,所有与多线程机制应用相关的类都是放在System.Threading命名空间中的。 如果你想在你的应用程序中使用多线程,就必须包含这个类。三.异步委托 创建线程的一个简单方式是定义一个委托,异步调用它。 那什么是异步委托呢?异步委托就是定义一个方法,开一个新线程,让这个方法在后台执
阅读全文
摘要:今天做了一个小例子,实现在winform中利用事件在两个窗体之间进行传值,加深了对事件的运用和理解。现在附上原创代码,如果有不完善的地方,还望大家指导和完善,谢谢!Form 1Cs:namespace EventTest{ public partial class Form1 : Form { public delegate void valueChangeHandle(string value); //定义一个委托 public static event valueChangeHandle valueChangeEvent; //定义事件 public Form1() { Initializ
阅读全文
浙公网安备 33010602011771号