C# 如何避免对同一方法c的多次调用#

C# 如何避免对同一方法c的多次调用#,c#,C#,我有一个c#方法,客户端是asp,当摄像头检测到QR码时就会触发该方法 protected void qrDetectado(object sender, EventArgs e) { ..... } 但是在某些情况下,它会多次检测同一个QR码,并多次调用qrDetectado方法,导致数据库出现很多问题,等等 有没有办法防止同时对同一方法进行多个调用 编辑:是的,只是想澄清一点,我通过js调用该方法,如果它已经读取了代码,我就不需要再次运行它 通常这种beheavior发生在它第一次

我有一个c#方法,客户端是asp,当摄像头检测到QR码时就会触发该方法

protected void qrDetectado(object sender, EventArgs e)
{
    .....
}
但是在某些情况下,它会多次检测同一个QR码,并多次调用qrDetectado方法,导致数据库出现很多问题,等等

有没有办法防止同时对同一方法进行多个调用

编辑:是的,只是想澄清一点,我通过js调用该方法,如果它已经读取了代码,我就不需要再次运行它


通常这种beheavior发生在它第一次读东西的时候,它有一些延迟,结果是我在数据库中有3到4倍的相同寄存器和一些其他问题,所以,我只需要运行它一次,一旦它完成,继续读

你可以解决这个问题的一种方法是使用
。这将在调用线程尝试获取对象的锁时阻止该线程,
\u syncRoot
,一次只能有一个线程锁定该对象。lock语句中的代码完成后,线程将释放锁,然后另一个线程可以进入该代码块。我已将对象声明为静态对象,以便它对于类的所有实例都是相同的对象。请注意,这不会跨服务器/进程锁定

   private static readonly object _syncRoot = new object();

   protected void qrDetectado(object sender, EventArgs e)
   {
        lock(_syncRoot)
        {
            // Do stuff
        }
   }
您可以阅读有关锁定的更多信息


如果实际上您只希望在对象的生命周期内调用它一次,并且只调用一次,那么您可以将锁与门标志结合起来。

这不会阻止该方法的多次执行。相反,它将同步运行它们。OP位于题为“如何避免对同一方法c多次调用”的问题的“防止同时对同一方法多次调用”之后。现在,这可能是一个更大问题的一部分,但这不是OP在他们的请求中所做的。@MickyD与前面的
多次调用qrDetectado方法相矛盾,导致了许多与并行运行无关的问题。由于这个问题有点含糊不清,我选择了更可能的解释,即不需要多次扫描同一个二维码(不管它是否平行)。@Rob你读过这个问题吗?“有没有一种方法可以防止同时对同一方法进行多个调用?”去抖动将防止客户端多次调用qrdetecatado。此外,在qrdetecatado上添加锁将防止在执行qrdetecatado时对qrdetecatado进行额外调用。也许OP应该澄清一下。我个人认为他/她会寻求锁定解决方案,而不是去Bouncing。你正在寻找的是去Bouncing。有许多技术,这取决于后端的调用方式。如果是javascript(很可能),请搜索javascript去Bouncing。大多数框架都支持它。如果没有,那么实现起来就很简单。实际上,听起来你应该阻止客户端调用两次,而不是阻止服务器端方法调用两次。当你说“有没有办法防止同时对同一方法进行多个调用”时你是说有多个线程同时调用这个阻塞方法,还是说这个方法是非阻塞的,同一个线程多次调用它?