<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_evail wolf</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/17158/rss</id><updated>2010-09-27T01:38:15Z</updated><author><name>holywolf</name><uri>http://www.cnblogs.com/holywolf/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/holywolf/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/17158/rss"/><entry><id>http://www.cnblogs.com/holywolf/archive/2010/09/27/1836464.html</id><title type="text">C#中lock关键字</title><summary type="text">lock关键字可以用来确保代码块完成运行，而不会被其他线程中断。这是通过在代码块运行期间为给定对象获取互斥锁来实现的。首先定义Account类,如下所示:该类中定义了某个帐户初使金额是500元,WithDraw方法用于从帐户中取钱,并在取钱之前判断要取的金额是否大于余额,在判断后如果满足条件则执行减操作,此处使用Thread.Sleep方法模拟操作过程中一些耗时操作以允许其他线程有机会执行.DoT...</summary><published>2010-09-27T01:38:00Z</published><updated>2010-09-27T01:38:00Z</updated><author><name>holywolf</name><uri>http://www.cnblogs.com/holywolf/</uri></author><link rel="alternate" href="http://www.cnblogs.com/holywolf/archive/2010/09/27/1836464.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/holywolf/archive/2010/09/27/1836464.html"/><content type="html">&lt;p&gt;lock关键字可以用来确保代码块完成运行，而不会被其他线程中断。这是通过在代码块运行期间为给定对象获取互斥锁来实现的。&lt;/p&gt;&lt;p&gt;首先定义Account类,如下所示:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;public class Account&lt;br/&gt;{&lt;br/&gt;private int balance = 500;&lt;br/&gt;&lt;br/&gt;public void WithDraw(int amount)&lt;br/&gt;{&lt;br/&gt;&lt;br/&gt;if (balance - amount &amp;gt; 0)&lt;br/&gt;{&lt;br/&gt;Console.WriteLine("{1}:before drawing:balance:{0},amount:{2}", balance, Thread.CurrentThread.Name, amount);&lt;br/&gt;Thread.Sleep(500);&lt;br/&gt;balance -= amount;&lt;br/&gt;Console.WriteLine("{1}:after drawing:balance:{0},amount:{2}", balance, Thread.CurrentThread.Name, amount);&lt;br/&gt;Console.WriteLine();&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;else&lt;br/&gt;{&lt;br/&gt;Console.WriteLine("{0}:no money", Thread.CurrentThread.Name);&lt;br/&gt;Thread.CurrentThread.Abort();&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;public void DoTrans()&lt;br/&gt;{&lt;br/&gt;Random ran = new Random();&lt;br/&gt;&lt;br/&gt;for (int i = 0; i &amp;lt; 10; i++)&lt;br/&gt;{&lt;br/&gt;WithDraw(ran.Next(50, 100));&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;}&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;&lt;p&gt;该类中定义了某个帐户初使金额是500元,WithDraw方法用于从帐户中取钱,并在取钱之前判断要取的金额是否大于余额,在判断后如果满足条件则执行减操作,此处使用Thread.Sleep方法模拟操作过程中一些耗时操作以允许其他线程有机会执行.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;DoTrans方法用于分10次随机从帐户中取款.接下来定义Main方法使用两个线程取款:&lt;/p&gt;&lt;p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;static void Main(string[] args)&lt;br/&gt;{&lt;br/&gt;&lt;br/&gt;Account a1 = new Account();&lt;br/&gt;&lt;br/&gt;Thread t1 = new Thread(new ThreadStart(a1.DoTrans));&lt;br/&gt;Thread t2 = new Thread(new ThreadStart(a1.DoTrans));&lt;br/&gt;&lt;br/&gt;t1.Name = "Thread 11111";&lt;br/&gt;t2.Name = "Thread 22222";&lt;br/&gt;&lt;br/&gt;t1.Start();&lt;br/&gt;t2.Start();&lt;br/&gt;&lt;br/&gt;Console.ReadLine();&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;运行项目会发现由于两个线程同时取款,在其中一个线程判断满足条件后休眠,由另外一个线程取款,取完款后再返回来执行第一个线程的取款操作,此时一线程已经执行过判断,继承取款会导致负数余额的产生.&lt;/p&gt;&lt;p&gt;因此解决方法可以使用lock关键字,将Account的WithDraw方法修正如下:&lt;/p&gt;&lt;p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;public void WithDraw(int amount)&lt;br/&gt;{&lt;br/&gt;lock (this)&lt;br/&gt;{&lt;br/&gt;if (balance - amount &amp;gt; 0)&lt;br/&gt;{&lt;br/&gt;Console.WriteLine("{1}:before drawing:balance:{0},amount:{2}", balance, Thread.CurrentThread.Name, amount);&lt;br/&gt;Thread.Sleep(500);&lt;br/&gt;balance -= amount;&lt;br/&gt;Console.WriteLine("{1}:after drawing:balance:{0},amount:{2}", balance, Thread.CurrentThread.Name, amount);&lt;br/&gt;Console.WriteLine();&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;else&lt;br/&gt;{&lt;br/&gt;Console.WriteLine("{0}:no money", Thread.CurrentThread.Name);&lt;br/&gt;Thread.CurrentThread.Abort();&lt;br/&gt;}&lt;br/&gt;}&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;可以保证该代码块不能被中断,从而使帐户金额不会产生负数的情况&lt;/p&gt;&lt;img src="http://www.cnblogs.com/holywolf/aggbug/1836464.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/holywolf/archive/2010/09/27/1836464.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/holywolf/archive/2009/06/15/1503490.html</id><title type="text">使用ASP.NET AJAX 和JQuery一起解决翻页选择的问题</title><summary type="text">开发项目中经常会遇到要求用户选择列表中数据的问题，例如选择允许参加某个活动的用户、选择允许参加某个项目的省市或地区，在数据量较小的情况下，我们可以把所有数据使用任何一种数据绑定控件显示出来并在每一个数据项前面显示复选框，但在数据量比较大时同时显示全部数据显然不太合适，我们首先考虑到的是使用分页。但是在使用分页后问题也随之而来，如何在切换分页时同时保持已选中项目，有些开发人员可能使用服务器端代码编写保存在Session中，这种方式最大的弊端在于每次都向服务器端提交，并且由于这些选中的数据只需要在当前页面使用，所以还白白的占用了Session。</summary><published>2009-06-15T03:27:00Z</published><updated>2009-06-15T03:27:00Z</updated><author><name>holywolf</name><uri>http://www.cnblogs.com/holywolf/</uri></author><link rel="alternate" href="http://www.cnblogs.com/holywolf/archive/2009/06/15/1503490.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/holywolf/archive/2009/06/15/1503490.html"/><content type="text">开发项目中经常会遇到要求用户选择列表中数据的问题，例如选择允许参加某个活动的用户、选择允许参加某个项目的省市或地区，在数据量较小的情况下，我们可以把所有数据使用任何一种数据绑定控件显示出来并在每一个数据项前面显示复选框，但在数据量比较大时同时显示全部数据显然不太合适，我们首先考虑到的是使用分页。但是在使用分页后问题也随之而来，如何在切换分页时同时保持已选中项目，有些开发人员可能使用服务器端代码编写保存在Session中，这种方式最大的弊端在于每次都向服务器端提交，并且由于这些选中的数据只需要在当前页面使用，所以还白白的占用了Session。</content></entry><entry><id>http://www.cnblogs.com/holywolf/archive/2009/05/26/1489380.html</id><title type="text">Visual C# 2010新特性之命名和可选参数与类型等价支持</title><summary type="text">Visual C# 2010引入了命名和可选参数和类型等价支持。命名参数允许调用者通过提供参数的名称来为其赋值，这样参数的位置就不在重要了。可选参数允许在定义时为某些参数赋值，在调用时可以忽略这些“可选的”参数。命名参数和可选参数可以应用在方法、索引器、构造函数和委托。命名参数和可选参数与dynamic类型结合在一起使用，可以方便的访诸如Office自动化API之类的COM API。类型等价支持允许发布运行时程序集的多个版本，包含嵌入类型信息的应用程序可以在没有重新编译的情况下使用多个版本工作。</summary><published>2009-05-26T02:24:00Z</published><updated>2009-05-26T02:24:00Z</updated><author><name>holywolf</name><uri>http://www.cnblogs.com/holywolf/</uri></author><link rel="alternate" href="http://www.cnblogs.com/holywolf/archive/2009/05/26/1489380.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/holywolf/archive/2009/05/26/1489380.html"/><content type="text">Visual C# 2010引入了命名和可选参数和类型等价支持。命名参数允许调用者通过提供参数的名称来为其赋值，这样参数的位置就不在重要了。可选参数允许在定义时为某些参数赋值，在调用时可以忽略这些“可选的”参数。命名参数和可选参数可以应用在方法、索引器、构造函数和委托。命名参数和可选参数与dynamic类型结合在一起使用，可以方便的访诸如Office自动化API之类的COM API。类型等价支持允许发布运行时程序集的多个版本，包含嵌入类型信息的应用程序可以在没有重新编译的情况下使用多个版本工作。</content></entry><entry><id>http://www.cnblogs.com/holywolf/archive/2009/05/25/1488708.html</id><title type="text">Visual C# 2010新特性之dynamic类型</title><summary type="text">在Visual C# 2010中引入了一种新的dynamic类型。在大多数情况下dynamic和object类型有些相似，但是在编译时，dynamic类型被假定为支持任何操作，也就是说dynamic类型的对象可以是一个Office对象，可以是一个COM对象或者是DOM对象，而如果在运行时发现该对象不是期望的对象则会抛出一个运行时异常。Visual C# 2010使用dynamic类型和命名和可选参数为与COM API交互提供了便利。许多COM方法接收各种类型参数并且通常会返回object类型值，开发人员需要进行类型转换以进行进一步操作,dynamic类型允许在COM调用时将object类型作为dynamic类型对待，这样可以避免类型转换。</summary><published>2009-05-25T02:40:00Z</published><updated>2009-05-25T02:40:00Z</updated><author><name>holywolf</name><uri>http://www.cnblogs.com/holywolf/</uri></author><link rel="alternate" href="http://www.cnblogs.com/holywolf/archive/2009/05/25/1488708.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/holywolf/archive/2009/05/25/1488708.html"/><content type="text">在Visual C# 2010中引入了一种新的dynamic类型。在大多数情况下dynamic和object类型有些相似，但是在编译时，dynamic类型被假定为支持任何操作，也就是说dynamic类型的对象可以是一个Office对象，可以是一个COM对象或者是DOM对象，而如果在运行时发现该对象不是期望的对象则会抛出一个运行时异常。Visual C# 2010使用dynamic类型和命名和可选参数为与COM API交互提供了便利。许多COM方法接收各种类型参数并且通常会返回object类型值，开发人员需要进行类型转换以进行进一步操作,dynamic类型允许在COM调用时将object类型作为dynamic类型对待，这样可以避免类型转换。</content></entry><entry><id>http://www.cnblogs.com/holywolf/archive/2009/04/02/1427704.html</id><title type="text">ASP.NET自定义控件 第十天 实现分页功能的DataList（附该系列文章PDF版本）</title><summary type="text">ASP.NET自定义控件最后一篇文章,由于时间限制,本系列不会再发布自定义控件设计时支持方面的文章,同时应网友要求,提供PDF版本下载.在ASP.NET中DataList可以实现数据展示，我们可以通过定制其模版实现丰富的格式，但是美中不足的时DataList默认情况下不支持分页，我们当然可以编写一个用户控件以实现分页功能，但是这种方案仍然不是很好，我们希望像使用普通ASP.NET服务器端控件一样，只需要放置一个DataList并设置分页样式就可以输出分页链接。</summary><published>2009-04-02T02:05:00Z</published><updated>2009-04-02T02:05:00Z</updated><author><name>holywolf</name><uri>http://www.cnblogs.com/holywolf/</uri></author><link rel="alternate" href="http://www.cnblogs.com/holywolf/archive/2009/04/02/1427704.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/holywolf/archive/2009/04/02/1427704.html"/><content type="text">ASP.NET自定义控件最后一篇文章,由于时间限制,本系列不会再发布自定义控件设计时支持方面的文章,同时应网友要求,提供PDF版本下载.在ASP.NET中DataList可以实现数据展示，我们可以通过定制其模版实现丰富的格式，但是美中不足的时DataList默认情况下不支持分页，我们当然可以编写一个用户控件以实现分页功能，但是这种方案仍然不是很好，我们希望像使用普通ASP.NET服务器端控件一样，只需要放置一个DataList并设置分页样式就可以输出分页链接。</content></entry><entry><id>http://www.cnblogs.com/holywolf/archive/2009/01/14/1375303.html</id><title type="text">ASP.NET自定义控件 第九天 自定义GridView</title><summary type="text">ASP.NET 2.0里为我们提供了全新的GridView控件，它在DataGrid基础之上增加了许多新的特性，例如不编写一行代码就可以和数据源控件结合起来实现数据的展示并且分页，但是这种分页效率较低，这是从数据库一次读取所有的数据再进行分页，如果数据量较少则可以实现快速开发，但是假如数据库中存放大量数据，这种操作性能显得就比较低了，所以我们一般自己编写数据读取方法，在PageIndexChanging事件中绑定新页，这时会遇到一个问题，如果我们仅读取一页数据时GridView不能正确计算出共有多少页，也就无法正确呈现出分页按钮，因此需要考虑对其进行扩展。另外DataList控件提供了灵活的模版设置以显示记录内容，但是它有一个最大的弱点就是不支持分页，我们同样试图扩展DataList以增加分页的特性。</summary><published>2009-01-14T01:46:00Z</published><updated>2009-01-14T01:46:00Z</updated><author><name>holywolf</name><uri>http://www.cnblogs.com/holywolf/</uri></author><link rel="alternate" href="http://www.cnblogs.com/holywolf/archive/2009/01/14/1375303.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/holywolf/archive/2009/01/14/1375303.html"/><content type="text">ASP.NET 2.0里为我们提供了全新的GridView控件，它在DataGrid基础之上增加了许多新的特性，例如不编写一行代码就可以和数据源控件结合起来实现数据的展示并且分页，但是这种分页效率较低，这是从数据库一次读取所有的数据再进行分页，如果数据量较少则可以实现快速开发，但是假如数据库中存放大量数据，这种操作性能显得就比较低了，所以我们一般自己编写数据读取方法，在PageIndexChanging事件中绑定新页，这时会遇到一个问题，如果我们仅读取一页数据时GridView不能正确计算出共有多少页，也就无法正确呈现出分页按钮，因此需要考虑对其进行扩展。另外DataList控件提供了灵活的模版设置以显示记录内容，但是它有一个最大的弱点就是不支持分页，我们同样试图扩展DataList以增加分页的特性。</content></entry><entry><id>http://www.cnblogs.com/holywolf/archive/2009/01/12/1373951.html</id><title type="text">ASP.NET自定义控件 第八天 显示多个条目星级评分的列表控件</title><summary type="text">前几次任务里我们开发的星级控件只能显示一个条目的评分，在现实生活中，经常会遇到需要向用户展示一系列数据的评分状态，例如要显示一个软件评分的列表，通常这些数据是从数据库中读取的，在本次任务里将尝试开发这样一个复杂的数据绑定控件</summary><published>2009-01-12T01:00:00Z</published><updated>2009-01-12T01:00:00Z</updated><author><name>holywolf</name><uri>http://www.cnblogs.com/holywolf/</uri></author><link rel="alternate" href="http://www.cnblogs.com/holywolf/archive/2009/01/12/1373951.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/holywolf/archive/2009/01/12/1373951.html"/><content type="text">前几次任务里我们开发的星级控件只能显示一个条目的评分，在现实生活中，经常会遇到需要向用户展示一系列数据的评分状态，例如要显示一个软件评分的列表，通常这些数据是从数据库中读取的，在本次任务里将尝试开发这样一个复杂的数据绑定控件</content></entry><entry><id>http://www.cnblogs.com/holywolf/archive/2008/12/30/1364741.html</id><title type="text">ASP.NET自定义控件 第七天 开发具有丰富特性的列表控件</title><summary type="text">在上次任务里，我们为星级控件增加了数据绑定的特性，但是在实际运用中还会产生更多的需求，例如用户可能希望创建一个课程列表，或者在数据项比较多的时候，能够手动控制数据的排列方式——类似于DataList一样，这类控件在ASP.NET中是如何开发出来的呢</summary><published>2008-12-30T00:56:00Z</published><updated>2008-12-30T00:56:00Z</updated><author><name>holywolf</name><uri>http://www.cnblogs.com/holywolf/</uri></author><link rel="alternate" href="http://www.cnblogs.com/holywolf/archive/2008/12/30/1364741.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/holywolf/archive/2008/12/30/1364741.html"/><content type="text">在上次任务里，我们为星级控件增加了数据绑定的特性，但是在实际运用中还会产生更多的需求，例如用户可能希望创建一个课程列表，或者在数据项比较多的时候，能够手动控制数据的排列方式——类似于DataList一样，这类控件在ASP.NET中是如何开发出来的呢</content></entry><entry><id>http://www.cnblogs.com/holywolf/archive/2008/12/26/1362679.html</id><title type="text">ASP.NET自定义控件 第六天 可以绑定数据源的星级控件</title><summary type="text">以上几个任务里，我们创建了一些简单但很实用的自定义控件，但是它们只能按照固定的设置进行呈现，缺少一些关键的特征——数据绑定和有时为了更灵活的控制以支持模版设置，本次任务里将为星级控件添加数据绑定的特性。</summary><published>2008-12-26T00:55:00Z</published><updated>2008-12-26T00:55:00Z</updated><author><name>holywolf</name><uri>http://www.cnblogs.com/holywolf/</uri></author><link rel="alternate" href="http://www.cnblogs.com/holywolf/archive/2008/12/26/1362679.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/holywolf/archive/2008/12/26/1362679.html"/><content type="text">以上几个任务里，我们创建了一些简单但很实用的自定义控件，但是它们只能按照固定的设置进行呈现，缺少一些关键的特征——数据绑定和有时为了更灵活的控制以支持模版设置，本次任务里将为星级控件添加数据绑定的特性。</content></entry><entry><id>http://www.cnblogs.com/holywolf/archive/2008/12/24/1361003.html</id><title type="text">ASP.NET自定义控件 第五天 真正可以评分的星级控件</title><summary type="text">在前几次任务里开发的星级控件仅适用于静态展示，例如标明某个软件的受欢迎度，但是实际上很多网站还希望能够由用户对某一信息进行评分，最终计算出该信息的受欢迎程度，使数据更为客观和可信，由此需要在原有的星级控件上加以改进，使用户能够动态评分</summary><published>2008-12-24T01:18:00Z</published><updated>2008-12-24T01:18:00Z</updated><author><name>holywolf</name><uri>http://www.cnblogs.com/holywolf/</uri></author><link rel="alternate" href="http://www.cnblogs.com/holywolf/archive/2008/12/24/1361003.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/holywolf/archive/2008/12/24/1361003.html"/><content type="text">在前几次任务里开发的星级控件仅适用于静态展示，例如标明某个软件的受欢迎度，但是实际上很多网站还希望能够由用户对某一信息进行评分，最终计算出该信息的受欢迎程度，使数据更为客观和可信，由此需要在原有的星级控件上加以改进，使用户能够动态评分</content></entry></feed>
