C# 在线程之间执行一次操作
我有一个例子,使用多个线程从web服务进行查询。有时,我必须向web服务器验证自己的身份,因为会话在此之后过期。我的授权方式如下:C# 在线程之间执行一次操作,c#,multithreading,web-services,C#,Multithreading,Web Services,我有一个例子,使用多个线程从web服务进行查询。有时,我必须向web服务器验证自己的身份,因为会话在此之后过期。我的授权方式如下: static void threadCall(){ try{ ws.query(); } catch(AuthenticationFailException ex){ AuthAgain(); threadCall(); return; } } 问题是,多个线程的身份验
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。但是它不应该重新验证,因为线程将在锁上等待,并且在锁内,状态将再次检查。