当前位置 > 首页 > Asp.net

你没用过的.net4.0

2012-12-7 11:11:00来源: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();
//这一句只是为了查看结果使用
}
/*
* 以下是微软给出的注意事项<

  • 分享一个单例模型类 Singleton

    2009-10-14 18:47:00

    摘要: 每个对象都写单例,单调又无聊。因此我写了个基类,只要集成,就实现了单例。而且支持多单例(不同id对应不同的单例)[代码]使用方法:[代码]看看有什么错误等,希望能够指出。谢谢!reborn_

  • SICP学习笔记(2.1.4)

    2009-10-28 0:11:00

    阅读: 151 评论: 1 作者: 周银辉 发表于 2009-10-27 21:47 原文链接 SICP学习笔记(2.1.4) 周银辉 1,练习2.7 要得到答

  • WPF编游戏系列 之九 物品清单再优化

    2009-12-20 10:39:00

    阅读: 0 评论: 0 作者: Gnie 发表于 2009-12-20 10:33 原文链接        在“ 第三篇 ”和“

  • .NET应用程序调试总结系列视频(二):VS Debugger Basics

    2010-11-25 10:46:00

    锋哥的调试系列视频终于更新了,这一次他给我们介绍了VS调试器最常用的基本功能,并演示了如何使用这些功能。有一部分是C#专用的,但是很多对与C++也非常管用。这次课程的内容如下: DebugVi

  • Vista下先安装VS再装IIS 7运行有500.19 Error的看一下

    2007-8-20 18:05:00

    有朋友的机器先装的Vista,然后直接安装了VS 2008 Beta 2,由于Vista默认不安装IIS 7,当部署Web App时才去安装IIS 7,结果访问站点就出现500.19错误:HTTP

  • Tree Surgeon has a new home... on CodePlex!

    2007-4-3 15:16:00

    About a week or so ago Mike Roberts posted a note that he was no longer going to be working in the

  • Using the WebGrid Helper in ASP.NET MVC 3 Beta

    2010-10-8 17:29:00

    ASP.NET MVC 3 Beta is now supports to using ASP.NET Web Pages helpers in the Razor views. In post,

  • Checkout new mvc forum by telerik

    2009-1-31 21:34:00

    Checkout this new ASP.NET MVC Forum sample application by telerik. Source code is also available.

  • Microsoft Live Mesh用后感

    2009-6-5 16:06:00

    对于云计算,我们已不再陌生,以下是Live Mesh基于Cloud Service的大体架构图:(图片来自 wikipedia ) 对于各种新技术的推出,我们总是欣喜若狂,就拿Liv

  • 新做的贴代码片段的网站 pasite.org

    2009-8-24 21:04:00

    摘要: 这个东西是模仿国外 pastie.org 做的,当然CSS和UI都是复制的。使用 Ruby on Rails 开发,方便写博客要贴代码的时候可以有更好的显示样式。当然,除了用于贴代码,这个项