当前位置 > 首页 > Asp.net

你没用过的.net4.0

12/7/2012 11:11:00 AM来源:Asp.net

项目升级到.net 4.0很久了,但很多语法和知识点,还停留在以前的版本的有木有?

今天,我们就一块来看一下在.net 4.0的环境下我们如何编程的。

先从锁开始。需要你有一点点操作系统和多线程的基础哦。

再拉回过去,在处理并发的时候,平日大家都是如何实现一个锁的呢?

  • Lock

早在1.0时代,就有了Lock关键字,我们想实现一个自增长的场景:让多线程有序的访问静态类JingTai的num字段,不发生并发。

public class JingTai

{

public static int num = 0;

public int day = 0;

}

class Program

{

static void Main(string[] args)

{

//我们想实现一个场景:

//让多线程有序的访问静态类JingTai的num字段,不发生并发

int d = 23;

Thread[] thread = new Thread[d];

for (int i = 0; i < d; i++)

{

thread[i] = new Thread(new ThreadStart(GaiBianJingTai));

thread[i].Start();

}



Console.ReadLine();//这一句只是为了查看结果使用

}

static void GaiBianJingTai()

{

Random r = new Random();

int n = r.Next(111, 1111);

Thread.Sleep(n);



lock (typeof(JingTai))//请注意:如果没有lock(注释此行),每次的结果是不确定的,而且可能有重复的

{

Console.WriteLine(JingTai.num++);

}

}

}

 

Lock太简单了,我们就不赘述了。继续。。。

  • Monitor

Monitor也可以实现同样的功能,为共享资源加锁;他在.Net2.0的时代就已经出现了。

public class JingTai

{

public static int num = 0;

public int day = 0;

}

class Program

{

static void Main(string[] args)

{

//我们想实现一个场景:

//让多线程有序的访问静态类JingTai的num字段,不发生并发

int d = 23;

Thread[] thread
= new Thread[d];

for (int i = 0; i < d; i++)

{

thread[i]
= new Thread(new ThreadStart(GaiBianJingTai));

thread[i].Start();

}



Console.ReadLine();
//这一句只是为了查看结果使用

}

static void GaiBianJingTai()

{

Random r
= new Random();

int n = r.Next(111, 1111);

Thread.Sleep(n);

Monitor.Enter(
typeof(JingTai));

Console.WriteLine(JingTai.num
++);

Monitor.Exit(
typeof(JingTai));

}

}

我们来分析一下使用Monitor,他的致命缺陷在于性能:

线程使用Monitor访问共享的资源时候,如果他不能拿到锁,线程状态会有运行转换为阻塞,只以为着将会进行一个线程上下文的切换。如果每个线程对共享资源的访问时间很短,比如我们的只是num的值加1,那么使用Monitor必然带来频繁的线程上下文的切换,明显影响到程序运行的性能。

好了,镜头拉回现在.net4.0平台,微软才推出了新的自旋锁SpinLock。

  • SpinLock

当一个线程需要访问资源的时候,他调用SpinLock.Enter方法申请独占锁,如果不能获得锁(此时可能运行于另一个CPU核上的线程正在占有这个资源),当前线程就会空转若干个时间片,然后等下次时间片轮询到他的时候,他再尝试申请这个独占锁,在这个过程中该线程一直保持着运行时的状态哦,不会出现上下文的切换。

 

static void Main(string[] args)
{
//我们想实现一个场景:
//让多线程有序的访问静态类JingTai的num字段,不发生并发
int d = 23;
Thread[] thread
= new Thread[d];
for (int i = 0; i < d; i++)
{
thread[i]
= new Thread(new ThreadStart(GaiBianJingTai));
thread[i].Start();
}

Console.ReadLine();
//这一句只是为了查看结果使用
}
/*
* 以下是微软给出的注意事项<

  • NHibernate3剖析:Query篇之NHibernate.Linq自定义扩展

    8/12/2010 12:54:00 PM

    作者: 李永京 发表于 2010-08-11 20:05 原文链接 阅读: 731 评论: 14 本节内容 系列引入 概述 Linq

  • XamlPad小程序

    7/10/2007 10:02:00 AM

    摘要: 闲着没事,仿照SDK的样子自己做了一个。 程序主要使用了System.Windows.Markup命名空间下的XamlReader类和XamlWriter,其中XamlReader可

  • Gadget开发实战总结 2 (I See Pink Problem)

    9/6/2007 7:09:00 PM

    摘要: 在使用WebService解决了Gadget和服务端的通信问题之后,我们大部分时间都花在Gadget客户端的编写工作上。毕竟使用Gadget的一个目的就是那超炫的界面。在这其中也出现了不少的

  • 重温设计模式(四)——工厂模式

    4/11/2009 6:55:00 AM

    摘要: 1. 写在前面 这篇文章是我酝酿了近一个月的时间写出来的,我想在第一个模式上就写出工厂模式,却一直推迟到现在。 工厂模式,看似很容易,很常见,但是学习设计模式两年,我至今仍未能真正地充分理解

  • Pingf的stm32学习笔记之GPIO_Part1[0830]

    8/30/2009 4:41:00 PM

    摘要: Pingf的stm32学习笔记之GPIO_Part1配置完之后[见前面的文章],就可以写个简单的gpio程序了,但是在此之前还要了解一些基本知识。最起码应该知道stm32的电源与时钟的相关知

  • 到底什么是权限?我们应该如何正确理解“权限定义”(请高手指点)

    5/22/2009 1:15:00 PM

    曾经从别人那里学习到很多,现在也需要努力给予别人一些回报,不能太吝啬。 其实这个概念说简单也简单说难也很难,正确理解这个概念的人我见得不多,我也是在 2-3年前经过一个好朋友

  • 高手讨论:派生的窗口事件方法不能引用基类的事件方法

    5/31/2009 9:45:00 PM

    错误消息: 方法“”不能是事件的方法,因为派生出此类的类已经定义了该方法。 产生这个错误的原因是,你在基类声明了一个事件方法,派生类的事件直接使用了基类的事件方法。

  • 继续- 管理百人研发团队的烦恼(下)

    5/22/2007 12:26:00 AM

    上次在我的 博客上发布这片文章 ,浏览率还是很高,所以这次 5 月份的程序员杂志正好有出来,今天抽时间把下发布出来;感觉看了还是有点用的;

  • [翻译] Aggregator Provider模式——白皮书

    4/11/2009 3:08:00 PM

    [翻译] Aggregator Provider模式——白皮书 原文地址: http://code.msdn.microsoft.com/Project/Download/Fil

  • 功能预览:VS2010中快速查询文件或标签

    1/31/2009 8:30:00 PM

      [原文作者]: Lisa Feigenbaum [原文链接]: Walkthrough: Quick Search for Files and Symbols in Vi