Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.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# 在线程之间执行一次操作_C#_Multithreading_Web Services - Fatal编程技术网

C# 在线程之间执行一次操作

C# 在线程之间执行一次操作,c#,multithreading,web-services,C#,Multithreading,Web Services,我有一个例子,使用多个线程从web服务进行查询。有时,我必须向web服务器验证自己的身份,因为会话在此之后过期。我的授权方式如下: static void threadCall(){ try{ ws.query(); } catch(AuthenticationFailException ex){ AuthAgain(); threadCall(); return; } } 问题是,多个线程的身份验

我有一个例子,使用多个线程从web服务进行查询。有时,我必须向web服务器验证自己的身份,因为会话在此之后过期。我的授权方式如下:

static void threadCall(){
    try{
        ws.query();
    }
    catch(AuthenticationFailException ex){
        AuthAgain();
        threadCall();
        return;
    }
}

问题是,多个线程的身份验证失败,并且多个线程希望同时进行身份验证。这会减慢进程,因此我只想对1个线程进行身份验证,并希望其他线程等待身份验证完成。我怎样才能做到这一点。

我会这样做

bool authenticated = false;
object lockObject = new object();

static void threadCall(){
    verifyAuthentication();
    try{
        ws.query();
    }
    catch(AuthenticationFailException ex){
        authenticated = false;
        threadCall();
        return;
    }
}

static void verifyAuthentication()
{
    if (!authenticated)
    {
        lock (lockObject)
        {
            if (!authenticated)
            {
                AuthAgain();
                authenticated = true;
            }
        }
    }
}

搜索[MethodImpl(MethodImplOptions.Synchronized)],或者实际上,这些不是我想要的。它们用于线程等待其他线程完成其作业。因此,一旦另一个线程完成,每个线程都将执行该任务。我想要的是,这项工作必须完成一次。廉价的解决方案:在所有线程之间设置为true的可访问bool,在其他线程内部执行一个while循环来执行一个线程。在合理的时间内睡眠,这样您就不会使用比需要更多的容量,然后当您的一个线程完成身份验证时,将bool设置为false。另一件可能有助于为您的问题找到更清晰的解决方案的事情是查看Task.Wait()-方法好的,记住您需要处理身份验证问题。在本例中,由于threadCall的递归调用,它将遇到stackoverflow。这会减少已完成的身份验证的数量,但这并不完美。在一个线程完成身份验证后,如果另一个线程在catch之后的行中,它可以将authenticated设置为false。是的,变量设置为false。但是它不应该重新验证,因为线程将在锁上等待,并且在锁内,状态将再次检查。