C#特有线程功能

开发 后端
这里介绍C#特有线程功能,C#中确实有一些Java不支持的方法、类和函数,对于铁杆的Java线程编程人员而言,这可是一件好事,因为他们可以用C#编写代码,然后在Java代码中引用。

C#特有线程功能

C#特有线程功能,我们一直对C#抱有很高的期望,C#中确实有一些Java不支持的方法、类和函数,对于铁杆的Java线程编程人员而言,这可是一件好事,因为他们可以用C#编写代码,然后在Java代码中引用。

要在Java中获得某一变量的锁,必须在代码的首尾二端加上synchronized关健字,指明需要获得锁的对象。一旦线程开始执行 synchronized块中的代码,它就获得了对这一对象的锁的控制权。同样,一旦线程已经离开了synchronized块,它也将释放这一对象的锁。我们已经知道,C#也有一个相似的被称作lock的关健字。除了lock这个关健字外,C#还提供了内置的获得和释放锁的方法:Monitor.Enter(object obj)和Monitor.Exit(object obj),通过使用这些方法,编程人员可以获得与使用lock相同的作用,但提供了更精确的控制方法。例如,可以在一个方法中锁定几个变量,而不同时或在代码中的不同部分释放它们。

对一个需要进行同步的对象执行System.Threading.Monitor.Enter操作将使线程获得该对象的锁,或者在由其他线程控制着该对象的锁时进行阻塞。通过执行Monitor.Exit方法就可以释放锁,如果线程已经不控制着该对象的锁了,这一方法将会产生一个 System.Threading.SynchronizationLockException异常信号。

C#中的Monitor类不但包括Enter方法,还包括TryEnter方法,如果执行该方法,就会或者获得一个锁,或者返回一个表明它不能获得锁的返回值。

原子操作

System.Threading.Interlocked类提供了程序对由几个线程共享的变量进行同步访问的能力,C#把一些操作抽象为“原子”操作或“不可分割”的操作。为了说明这一问题是如何解决的,我们来看一下下面的Java代码:

  1. public static int x = 1;  
  2. public static void increment() {  
  3. xx = x 1;  
  4. }  

如果有二个不同的线程同时调用increment(),x***的值可能是2或3,发生这种情况的原因可能是二个进程无序地访问x变量,在没有将x置初值时对它执行加1操作;在任一线程有机会对x执行加1操作之前,二个线程都可能将x读作1,并将它设置为新的值。

在Java和C#中,我们都可以实现对x变量的同步访问,所有进程都可以按各自的方式运行。但通过使用Interlocked类,C#提供了一个对这一问题更彻底的解决方案。Interlocked类有一些方法,例如Increment(ref int location)、Decrement(ref int location),这二个方法都取得整数型参数,对该整数执行加或减1操作,并返回新的值,所有这些操作都以“不可分割的”方式进行,这样就无需单***建一个可以进行同步操作的对象,如下例所示:

  1. public static Object locker = ...  
  2. public static int x = 1;  
  3. public static void increment() {  
  4. synchronized( locker ) {  
  5. xx = x 1;  
  6. }  
  7. }  

C#中的Interlocked类可以用下面的代码完成相同的操作:

  1. public static int x = 1;  
  2.  
  3. public static void Increment() {  
  4. Interlocked.Increment( ref x );  
  5.  
  6. }  

Interlocked中还包括一个名字为Exchange的方法,可以“不可分割”地将一个变量的值设置为另一个变量的值。

线程池

如果许多利用了线程的应用软件都创建线程,这些线程将会因等待某些条件(键盘或新的I/O输入等)而在等待状态中浪费大部分的时间,C#提供的 System.Threading.ThreadPool对象可以解决这一问题。使用ThreadPool和事件驱动的编程机制,程序可以注册一个 System.Threading.WaitHandle对象(WaitHandle是C#编程中等待和通知机制的对象模型)和 System.Threading.WaitOrTimerCallback对象,所有的线程无需自己等待WaitHandle的释放,ThreadPool将监控所有向它注册的WaitHandle,然后在WaitHandle被释放后调用相应 WaitOrTimerCallback对象的方法。 以上介绍C#特有线程功能。

【编辑推荐】

  1. 描述C# Anonymous Type
  2. C#调用CreateObject
  3. 浅谈C#对象和集合
  4. C#分部方法的应用场景
  5. 浅析C# Anonymous Type
责任编辑:佚名 来源: Sina
相关推荐

2009-08-18 09:26:07

C#线程功能

2009-08-25 15:09:30

C#线程的启动

2009-08-12 18:04:44

编写C#多线程

2009-09-04 14:41:09

C#同步线程

2009-08-12 13:11:24

C#实现远程线程插入

2009-08-27 18:05:54

C#索引功能

2009-09-07 15:40:06

2009-09-02 17:29:10

C# TextBox换

2009-09-07 13:02:52

Java和C#线程

2009-08-28 16:51:32

C#线程控制

2009-08-04 17:57:41

C#线程同步死锁

2009-09-04 15:09:48

C#多线程启动Squa

2009-08-28 16:43:57

C#多线程学习

2009-08-26 10:43:14

C#实现打印功能

2009-08-26 09:22:44

C#实现打印功能

2009-08-04 18:00:51

C#线程同步Monitor

2009-08-28 15:57:56

C#线程传递参数

2009-08-04 16:58:21

C#线程BeginInvokeEndInvoke

2009-08-28 17:10:59

C#线程优先级

2009-08-28 15:37:22

C#线程类的定义
点赞
收藏

51CTO技术栈公众号