我网站有4-5个操作 只允许 一个用户操作
如果一个用户正在运行 另一个用户来了企图运行 我就给他返回“等一会再试” (并不是堵塞 直接返回让他过一会再试)
我的代码:
class Lock
{
private static bool _isLocked = false;
private static object _objLock = new object(); public bool acquireLock()
{
lock (_objLock)
{
if (!_isLocked)
{
_isLocked = true;
return true;
}
else
{
return false;
}
}
} public void releaseLock()
{
lock (_objLock)
{
_isLocked = false;
}
}
}
某位高手的代码
class MyLock
{
private static bool _isLocked = false;
private static object _objLock = new object(); public bool Execute(Action a)
{
bool lockTaken = false;
try
{
Monitor.TryEnter(_objLock , ref lockTaken);
if (_lockTaken)
{
a();
}
}
finally
{
if (lockTaken)
{
Monitor.Exit(lockObject);
}
}
return lockTaken;
} }
我就想问问他的办法好在哪?另外有什么更好的办法么
如果一个用户正在运行 另一个用户来了企图运行 我就给他返回“等一会再试” (并不是堵塞 直接返回让他过一会再试)
我的代码:
class Lock
{
private static bool _isLocked = false;
private static object _objLock = new object(); public bool acquireLock()
{
lock (_objLock)
{
if (!_isLocked)
{
_isLocked = true;
return true;
}
else
{
return false;
}
}
} public void releaseLock()
{
lock (_objLock)
{
_isLocked = false;
}
}
}
某位高手的代码
class MyLock
{
private static bool _isLocked = false;
private static object _objLock = new object(); public bool Execute(Action a)
{
bool lockTaken = false;
try
{
Monitor.TryEnter(_objLock , ref lockTaken);
if (_lockTaken)
{
a();
}
}
finally
{
if (lockTaken)
{
Monitor.Exit(lockObject);
}
}
return lockTaken;
} }
我就想问问他的办法好在哪?另外有什么更好的办法么
解决方案 »
- WebBrowser加载完成后,再禁止css,javascript的执行,怎么实现?
- 请教关于 webBrowser_DocumentCompleted 问题!!!!!!!!
- 使用Random的两个误区,兼散分帖~
- WebClient.UploadFile中的类似input的name写在什么地方?
- 如何在visual studio 实现嵌入式
- 输出控件怎么换行?
- 远程数据库管理系统有关问题。
- 如何将一个Html格式文件转换为Excel文件(可以用OleDb读取的Excel格式)。
- c#如何写多个表同时操作的事物处理
- 如何将多个TextBox中的数据添加到DataGrid控件中?在线waiting!!
- [求助]System.Windows.Forms.Timer,这个Timer时间间隔为5s,计到4s时,我想让其重新开始(再从零开始计),代码怎么写啊
- 用linq怎么解决字段中含有数组的问题?高手进来下!
静态类里面一个静态 bool 类型 来判断是否有人登陆,当然这个变量是全局的,对于所有用户都是可以访问操作的.
这样 就不用你说的那种了,你说的那种不行的..
那你干嘛lock??
就是一个静态变量而已.
登录前 先判断 变量是不是 true
是true 就等待
不是 就登陆,然后 赋值true退出登陆 就赋值 false .
{
private static object _objLock = new object();
public bool Execute(Action a)
{
bool lockTaken = false;
try
{
Monitor.TryEnter(_objLock, ref lockTaken);
if (lockTaken)
{
a();
}
}
finally
{
if (lockTaken)
{
Monitor.Exit(_objLock);
}
}
return lockTaken;
}
}
高手的方法真不错,可以同步任何一个你想同步的方法,简单清爽
直接全局或静态变量啊
有人用 置1 用的人退出后 置0.
但不现实,因为bS程序,用户是不是再用,你也不知道。只能通过session过期。
你这个业务模型实在是太诡异了。至于代码,你的代码直接就有问题,acquireLock()返回的结果永远就是!_isLocked。
你加锁完全是白加了,临界区没控制好,设计多线程、线程同步之前,先搞明白哪些代码是在临界区内,哪些临界区外,还有,既然用了多线程或线程同步,慎用静态变量。仔细看看,我似乎没弄明白你的业务逻辑,
“我网站有4-5个操作 只允许 一个用户操作 ”
这句话是微观上,cpu时间片级别的,只允许一个用户操作,比如数据库curd?
还是宏观上的,a用户操作3-5min,期间其他用户不能操作?必须等a用户完成?
不过运行方面 功能我的代码没问题吧是宏观的a用户操作3-5min,期间其他用户不能操作?必须等a用户完成?
2.考虑到了异常情况
3.Monitor相对于lock,不怕死锁想不到其他了