当前位置 > 首页 > 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();
//这一句只是为了查看结果使用
}
/*
* 以下是微软给出的注意事项<

  • Enabling TFS Integration in Blend 3

    8/8/2009 9:36:00 AM

    To enable TFS source control integration in Expression Blend 3, you need to install this hotfix:

  • 讨论两个世界级的难题

    2/7/2009 10:01:00 AM

    摘要: 当我还在大四的时候,记得曾经碰到过这样一个难题。那个时候硬是没有解决。结果后来才知道,那是个世界级的难题,不知道现在还是不是。 问题是这样的: 比如:本篇文章,或者,现在就找个 实验站 吧

  • ClubStarterKit – Caching for performance

    12/12/2009 2:52:00 AM

    First of all, if you haven’t heard, I recently released ClubStarterKit v3 Preview. If you haven’t h

  • SQL Server树型结构数据处理的存储过程

    1/25/2010 2:17:00 PM

    阅读: 396 评论: 1 作者: Neo.Yan 发表于 2010-01-25 11:53 原文链接 我们在平常的系统开发中常常会遇到像无限级分类这样的树型结构数据,现提供一个可用的数据

  • vb2010.net怎么调用外部进程

    1/7/2012 2:27:00 PM

    如题

  • 在WorldWind中加入三维模型

    2/10/2007 12:55:00 AM

    Nasa支持的WorldWind项目最近推出了1.4RC5版,可以加入三维模型,效果如下图所示: 点击查看大图 WW1.4对XML配置文件增加了许多新的元素,其中M

  • 通过实例模拟ASP.NET MVC的Model绑定机制:数组

    5/30/2012 8:20:00 AM

    [续《 通过实例模拟ASP.NET MVC的Model绑定机制:简单类型+复杂类型] 》]基于数组和集合类型的Model绑定机制比较类似,对于绑定参数类型或者参数类型的某个属性为数组或者集合,如果V

  • Interesting Finds: 2009 05.18 ~ 05.24

    5/24/2009 10:58:00 AM

    .NET Whats New in the BCL in .NET 4 Beta 1 How CLR maps SEH exceptions to managed

  • 我谈通“下水道”(系列连载1)

    9/21/2009 10:01:00 PM

    摘要: 说起接口,想必很多干开发的弟兄都做过。接口它就像下水道,堵着的时候东家很不爽,咱就得去通,就得去“捅”。我也是,而且我在这个公司一捅三年多,没有哪天不想着、说着、捅着

  • 学习jQuery(一),做的第一个可拖动列的Grid

    9/6/2009 2:54:00 AM

    摘要: 想想前些日子面试时人家问我会jQuery吗?我说不会,问我会用.net GridView吗?我说用的少,都直接写CSS.于是被拒之门外...呵呵,玩笑,当然还有其他原因啦。最近没工作没事干,