我碰到一块的C#代码来了今天这个样子:线程安全
lock(obj)
{
// perform various operations
...
// send a message via a queue but in the same process, Post(yourData, callback)
messagingBus.Post(data,() =>
{
// perform operation
...
if(condition == true)
{
// perform a long running, out of process operation
operation.Perform();
}
}
}
我的问题是这样的:可以在回调函数以这样的方式永远被调用,以使锁定(OBJ )到不是在operation.Perform()被调用之前被释放?也就是说,是否有一种方法可以在持有锁的同一个线程上调用回调函数,并且在该线程释放了锁之前?
编辑:messagingBus.Post(...)可以被认为是插入队列,然后立即返回。回调在其他线程上调用,可能来自线程池。
对于operation.Perform(),您可以将其读为Thread.Sleep(10000) - 只是运行很长时间并且不会共享或变更任何状态的东西。
如果lambda表达式或Post是异步的,那么完全可以在锁释放后调用Perform。 – vcsjones 2012-07-19 20:05:18
@SamIam:固定! – endian 2012-07-19 20:06:33
@vcsjones:谢谢,是的,我的问题恰恰相反 - 在Perform()运行时锁可以保持吗? – endian 2012-07-19 20:07:30