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;
}

转载于:https://www.cnblogs.com/mys0226/p/5749457.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值