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

  • 委托与事件 在.net的争霸战 ,你选择了谁?(异步委托产生的原因)

    2012-2-9 16:01:00

    如果你对委托和事件尚有模糊的地方请参阅上2篇博文。 如果你对下面8个问题,可以轻而易举的回答,那博文对你没什么作用。 1.为什么在发布者与订阅者的模式中,我们使用了事件而不使用委托变量

  • Silverlight学习笔记--绘制与着色(上)

    2009-11-24 21:02:00

    最近通过看WebCase的录像来学习Silverlight,为了避免学了后面忘了前面,把录像中的重点整理成笔记记录下来。 通过录像来学习Silverlight,我推荐看 苏鹏 讲的Silver

  • WPF 实现已绑定集合项目的移除时动画过渡

    2009-11-10 16:59:00

    阅读: 396 评论: 14 作者: DiryBoy 发表于 2009-11-10 13:42 原文链接 信不信由你,这个场景貌似没有官方的完美解决方案。我认为这个要求一点都不过分,花了很

  • 搞死ILDASM

    2009-4-24 3:20:00

    复制下面的代码: .assembly a {} .module a.dll .field static int32[-268435455...268435456] f_m268

  • 体验ADO.NET Entity Framework的继承

    2009-9-4 13:48:00

    摘要: ADO.NET Entity Framework(以下简称ADO.NET EF)有一个非常可信的运行时。之所以不敢在项目中广泛使用是因为其糟糕的设计时。这个DSL设计时糟糕在哪里呢?其一,只

  • Your Company's Next Senior Software Architect???

    2009-7-3 9:38:00

    I would *love* to join a new and exciting software development team that has a single-minded focus

  • 【总结—.Net Framework集合类】

    2011-9-15 20:18:00

    写在前面: 最近在学习 .Net 的集合框架,看了许多博文,也看了书,总感觉不是很明白。心里疑惑很多,每天郁闷度日。如果学技术时感到很痛苦,有两种可能,其一是学习方法不对

  • 我们与“盗墓的”是同行?

    2009-4-16 10:59:00

    摘要: 表面上看这是两个互不相干的职业,但自打听完了鬼吹灯系列之后,我就感觉还是有一些相似之处的,比如说:1.盗墓中分四大门派:摸金门、搬山门、卸岭门、发丘门,又称为摸金校尉、搬山道人、卸岭

  • Windows Identity Framework Released

    2009-11-18 21:12:00

    Good news: WIF was released today! Bad news: it requires Windows 7 or Windows Server 2008... Ge

  • 新浪微博SDK for .Net 4.0+发布了

    2012-5-24 15:35:00

    新浪微博开放平台API for .Net 4.0+ 首先,感谢大家使用此SDK!请提出宝贵意见,并及时反馈BUG以此来让这个SDK更好的服务广大的Coder。 此SDK的一些特性: 使