Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 锁定http请求以进行独占资源访问_C#_Asp.net Mvc_Asp.net Web Api - Fatal编程技术网

C# 锁定http请求以进行独占资源访问

C# 锁定http请求以进行独占资源访问,c#,asp.net-mvc,asp.net-web-api,C#,Asp.net Mvc,Asp.net Web Api,我有一个在本地sql表中查找值的服务。如果该值不存在,则它正在进行远程调用。如果有远程调用返回的值,则该值将添加到本地sql表中 我已经通知日志文件中的唯一索引异常,字符串值XXX已经存在 对我来说,这意味着发生了以下事情: Request1_localSqlCheck Request1_remoteCheck Request2_localSqlCheck Request2_remoteCheck Request1_AddValueLocallyIfRecievedByRemote Reques

我有一个在本地sql表中查找值的服务。如果该值不存在,则它正在进行远程调用。如果有远程调用返回的值,则该值将添加到本地sql表中

我已经通知日志文件中的唯一索引异常,字符串值XXX已经存在

对我来说,这意味着发生了以下事情:

Request1_localSqlCheck
Request1_remoteCheck
Request2_localSqlCheck
Request2_remoteCheck
Request1_AddValueLocallyIfRecievedByRemote
Request2_AddValueLocallyIfRecievedByRemote // Same value Added here causes exception.
我想让所有3个步骤都成为atom并锁定它:

Lock
{
Request1_localSqlCheck
Request1_remoteCheck
Request1_AddValueLocallyIfRecievedByRemote
}

这可以锁定这3个方法调用吗?

您可以使用
互斥锁来阻止代码执行,直到服务器返回值为止

例如:

    private readonly Mutex m = new Mutex();

    public int ThreadSafeMethod() {

        // you can do this immediately to skip the mutex
        if (Request1_localSqlCheck == 1) return 1;

        m.WaitOne();

        try {
            // check again
            if (Request1_localSqlCheck == 1) return 1;

            Request1_remoteCheck
            Request1_AddValueLocallyIfRecievedByRemote

        } finally {
            m.ReleaseMutex();
        }
    }
需要明确的是,如果频繁调用此代码,可能会出现问题,因为它会减慢所有其他线程等待互斥锁的速度


嗯,如果“独一无二”的错误不是什么大不了的,我想你可以坚持下去;这可能会很无聊,但有时尝试失败总比等待互斥释放并放慢速度要好。

锁不会跨越进程边界。如果此服务在一个服务器场或多个Worker中运行,则锁定是不够的。远程服务在clound中运行,但仅限于一个实例。我尝试/捕获了重复密钥异常,只从sql表返回了现有值。