参考文章:C#Mutex类用法总结
互斥锁创建以及优缺点
由于发送验证码为异步操作,避免用户在上一条验证码发送方法执行过程未结束时就又进入方法,所以在发送验证码时需要加上互斥锁Mutex
public async Task<CodeOutput> SendVerificationCode_Web(RegisterSendCodeInput input)
{
CodeOutput output = new CodeOutput();
bool flag = false;
using (Mutex mutex = new Mutex(true, input.PhoneNumber, out flag)) //互斥锁,针对单一用户
{
if (!flag)
{
mutex.WaitOne(); //如果该手机号线程还没结束,则开始等待,此处可加上最长等待时间
}
if (!OneMinuteCheck("PhoneCaptcha", input.PhoneNumber)) //此处判断该手机号码为key的缓存是否存在以及时间是否过短
{
output.CanSend = false;
return output;
}
//此处发送验证码并存入缓存
//最后释放Mutex
mutex.ReleaseMutex();
}
return output;
}
注意:①如果不判断flag,第一次进入时就会进入等待,也就结束不了了
②如果不适用using,结束后一定要通过ReleaseMutex()方法释放掉当前mutex,否则后面进入的会一直处于等待的状态
③:不要在Mutex中执行过多的操作,否则跟单线程又有什么区别呢
出现问题:
使用using任然存在结束后未释放,原因不明。所在在内部使用mutex.ReleaseMutex()释放一边