c#lock不起作用(?)

时间:2016-07-04 19:24:46

标签: c# multithreading

我有以下锁定方案,似乎偶尔会错过锁定,让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。

1 个答案:

答案 0 :(得分:0)

不知道怎么说。猜测是会创建两个应用程序域,因为您正在使用生成多个应用程序域的内容,例如: Asp.net有时会为http模块执行此操作。