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

  • Viewing all Server Variables for a Site

    2010-3-11 13:45:00

    I often do development, testing or troubleshooting where I want to see all server variables availab

  • 过滤ASP.NET输出HTML中的无用空格

    2007-2-5 18:34:00

    刚才“不小心”检查了一下ASP.NET生成的代码,惊讶地发现ASP.NET输出的代码居然如此地不紧凑,在标签之间有无数的空格和制表符(TAB),特别是用了嵌套表格之后,那景象

  • .NET 4中用IIS部署WCF就这么简单

    2011-1-18 17:16:00

    在.NET 3.5中,我们需要这样做: 1. 添加一个HelloService.svc文件,添加ServiceHost标记,在Service中添加WCF服务实现的名称,比如: &l

  • SQLite入门与分析(八)---存储模型(1)

    2009-6-1 22:29:00

    写在前面:SQLite作为嵌入式数据库,通常针对的应用的数据量相对于通常DBMS的数据量是较小的。所以它的存储模型设计得非常简单,总的来说,SQLite把一个数据文件分成若干大小相等的页面,然后以B

  • WPF/E = Silverlight

    2007-4-17 1:32:00

    One of the reasons WPF/E is going to give Flash a real run for it's money is the video story. U

  • 《深入浅出设计模式-中文版》读书笔记(四)

    2010-7-6 11:19:00

    作者: virus 发表于 2010-07-06 06:34 原文链接 阅读: 530 评论: 0   今天要接触的是观察者模式Observer。   提到观察者,肯定会想到还应该有

  • asp.net回发问题

    2012-10-24 11:31:00

    网站的问题,点击button按钮后,所有的其他的控件如TextBox,dropdownlist的值都清空了。 但在本地测试时不清空的,填写过的值还都保留着,但上传服务

  • .net winform下 C#/VB.NET项目代码行数统计

    2009-6-4 22:43:00

    如图所示——如果能看到图的话。 因为一直想找个办法来统计一下自己写的代码总行数,但是打开代码文件一个一个的加有点儿太二了.而且还不能忽略空行和注释.因此就写了这么程序用

  • Config-free IHttpModule Registration

    2010-7-4 22:34:00

    The ASP.NET pipeline allows HTTP modules to plug in into the request processing lifecycle and do wo

  • 利用迭代器在.NET中实现“超轻量级线程”

    2009-10-8 15:26:00

    摘要: 经常在python,lua之类的脚本语言看到 超轻量级线程的概念,动辄上百万的线程,硕大的线程数量非常的养眼,今天突发奇想,在c#下也来弄个超轻量线程的实现,虽然很简陋,但是希望能和大家一起