我有以下锁定方案,似乎偶尔会错过锁定,让2个代码实例并行运行。非常感谢您帮助分析/修复代码。
public delegate void _D(A a);
namespace ExternalDll {
public event _D D;
}
namespace MainSpace {
ExternalDll _externalDll;
public static object lockObj = new object();
public static int counter = 0;
.
.
_externalDll.D += new _D(myEventHandler);
.
.
void myEventHandler(A a) {
lock (lockObj) {
counter++;
// do staff, printouts, etc.
Console.WriteLine("First={0}\n", counter);
// do other staff
Console.WriteLine("Second={0}\n", counter);
}
}
}
ExternalDll是一个dll文件,它接收信息a(类型A)的网络通信。它使用输入调用事件D.
主命名空间将myEventHandler注册到ExternalDll触发的事件D. 在myEventHanlder中有一个锁,所以预期的行为是锁部分内的代码在任何时候都不会执行多次。
但是,在运行应用程序时,有时会遇到锁定代码“并行”执行两次的情况。例如,我可能会看到如下打印输出:
First=0
First=1
Second=0
Second=1
这种情况尤其发生在突发网络事件的情况下,这些事件在很短的时间内(<1us)到达externalDll。
我的问题/要求是:
什么可以使锁定声明这种错误的行为。允许2个锁定代码实例?
如何改进代码,以便它提供所需的锁定行为。
谢谢,
-Moshe。
答案 0 :(得分:0)
不知道怎么说。猜测是会创建两个应用程序域,因为您正在使用生成多个应用程序域的内容,例如: Asp.net有时会为http模块执行此操作。