C# 并发--锁


///1. lock(this)的缺点就是在一个线程(例如本例的t1)通过执行该类的某个使用"lock(this)"的方法(例如本例的LockMe())锁定某对象之后, 导致整个对象无法被其他线程(例如本例的主线程)访问 - 因为很多人在其他线程(例如本例的主线程)中使用该类的时候会使用类似lock(c1)的代码。

2. 锁定的不仅仅是lock段里的代码,锁本身也是线程安全的。

3. 我们应该使用不影响其他操作的私有对象作为locker。

4. 在使用lock的时候,被lock的对象(locker)一定要是引用类型的,如果是值类型,将导致每次lock的时候都会将该对象装箱为一个新的引用对象(事实上如果使用值类型,C#编译器(3.5.30729.1)在编译时就会给出一个错误)。


//锁对象
private static readonly object LockObject = new object();


public static string GetNewCardID(string exhID)
{
string sql = string.Format("declare @VisitorCard varchar(10); exec [Spm_GetNextVisCard] {0},'NNNN','','',@VisitorCard output;select @VisitorCard ", exhID);

string VisitcardId = string.Empty;
//加锁
lock (LockObject)
{
VisitcardId = SqlHelper.ExecuteScalar(sql);
}
if (string.IsNullOrEmpty(VisitcardId))
{
//锁执行后依然有问题的话,那么允许失败一次,失败后延迟0.5秒再执行一次,如果再次失败那么就报错
System.Threading.Thread.Sleep(500);
VisitcardId = SqlHelper.ExecuteScalar(sql);
if (string.IsNullOrEmpty(VisitcardId))
{
CommonBasic.File.FileLog.WriteLog("卡号为空:", VisitcardId);
}
}

return VisitcardId;
}

posted @ 2016-08-08 15:29  xiaoxiaoma1  阅读(3217)  评论(0编辑  收藏  举报