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

  • Looking at how the ASP.NET MVC Authorize interacts with ASP.NET Forms Authorization

    2011-4-29 8:17:00

    Background: The Authorization flow in a default ASP.NET MVC Internet Application ASP.NET MVC incl

  • vc++.net 字符串

    2012-7-4 11:41:00

    String ^str="55"; 需要对55做一下数学运算--- 加22, 结果为77, 最后,将77赋值给str. (即:字符串-----数字--

  • 浅谈ASP.NET MVC

    2010-7-19 8:02:00

    作者: 飞林沙 发表于 2010-07-19 00:01 原文链接 阅读: 402 评论: 7 在正式的工作中使用ASP.NET MVC也有一阵子了,也看了听了很多关于ASP.NET M

  • C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(十五) 精灵控件横空出世!②

    2009-6-22 1:12:00

    摘要: 紧接着上一节,我们打开QXSpirit.xaml.cs文件。在游戏设计中,为了能够轻易控制及管理精灵的各项属性及功能等,我赋予每个精灵一个专属线程,它在精灵的使用中起到关键作用: ---

  • Silverlight 3 DataForm Control Mapping - Add Extensibility

    2009-8-2 1:34:00

    An earlier posting explains how to perform basic modifications to the Silverlight 3 DataForm contro

  • 贝叶斯网络工具Hugin api的使用

    2009-4-7 12:57:00

    摘要: 由于做毕设的需要,最近一直在研究Hugin Expert,一个关于贝叶斯网络的软件,今天有一些眉目,总结一下,方便自己也方便他人。 Hugin Expert是一款商业软件,提供c、c++、

  • 详解AJAX核心 —— XMLHttpRequest 对象

    2009-4-14 10:52:00

    摘要: 我要说的内容都是非常基础的内容,高手就免看了,如果看了欢迎给点意见啊。新手或者对低层还不是很了解的人可以看看,帮助理解与记忆。XMLHttpRequest 对象是AJAX功能的核心,要开发A

  • Ndo 新版本发布

    2007-3-8 18:15:00

    由于工作的原因,Ndo 的版本发布和更新有点慢,现在简单介绍一下Ndo 的新功能. 1: 支持1.1 和 2.0, 支持泛性 2: INdoManager接口增加了很多IStatement, IP

  • 使用NSun(框架)快速开发项目(四)NSun1.0.0.2发布

    2009-8-28 15:22:00

    摘要: NSun 1.0.0.1已在项目中应用。这次1.0.0.2的改动是以前2个版本的扩展,重构,修正版。修正了1.0.0.1在项目中遇到的问题和BUG。总结业务层常用方法,新增BLL

  • [ASP.NET]如何灵活定制皮肤/页面:布局设计器介绍

    2007-2-6 10:37:00

    以前看过DotNetNuke 4(以下简称DNN)的部分源码,作为一个CMS它的实现无疑有很多值得借鉴的地方。个人比较注重页面的呈现部分,所以特别关注其中的换肤、布局等部分,虽然DNN的这方面的实现