我知道在某些情况下,例如长时间运行的进程,锁定ASP.NET缓存非常重要,以避免其他用户对该资源的后续请求再次执行长进程而不是命中缓存.
在ASP.NET中实现缓存锁定的最佳方法是什么?
如果我有一个在我的webservice中编辑数据库的函数,我只想让一个线程一次执行,如果他们试图编辑同一行.
void EditCheck(long checkid)
{
if (isCheckCosed)
throw new Exception("check is already closed");
//do stuff
//after i edit my check i want to close it.
CloseCheck();
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以锁定整个功能,但随后我失去了性能,因为它几乎从来没有那个不同的线程会尝试编辑相同的检查.
有没有办法只锁定具有相同checkid的其他线程?
UPDATE
我用OleDbConnection和MySqlConnection
OleDbCommand oleDbCommand = AccessTrans != null ?
new OleDbCommand(sql, AccessConn, AccessTrans) : new OleDbCommand(sql, AccessConn);
oleDbCommand.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)
相同的功能 MySqlCommand
然后我使用正常的INSERT和UPDATE sql命令.并检查交易是否存在.所以如果你想在上层功能中进行交易,这个功能是有效的.
从数据库中读取我会填写 DataTable
OleDbCommand oleDbCommand = AccessTrans != null ? new OleDbCommand(sql, AccessConn, AccessTrans) : new OleDbCommand(sql, AccessConn);
OleDbDataAdapter dAdapter = new OleDbDataAdapter();
dAdapter.SelectCommand = oleDbCommand;
dAdapter.Fill(dTable); …Run Code Online (Sandbox Code Playgroud) 假设我有这个方法:
void Foo(int bar)
{
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
这是我想要的行为Foo:
如果线程1调用Foo(1)和线程2调用Foo(2),则两个线程可以并发运行.
如果线程1调用Foo(1)和线程2调用Foo(1),则两个线程不能同时运行.
是否有一种良好,标准的方式.net来指定这种行为?我有一个使用对象字典锁定的解决方案,但这感觉有点混乱.
如何lock根据特定的字符串键执行?
public void PerformUpdate(string key)
{
// TODO: Refine this, since they key-string won't
// be the same instance between calls
lock(key)
{
PerformUpdateImpl()
}
}
Run Code Online (Sandbox Code Playgroud)
我试图将锁定对象保留在一个ConcurrentDictionary,但不知怎的,这也不会阻止.