2015-03-02 97 views
0

我有一種情況,我正在使用多個線程從Web服務進行查詢。一次之後,我必須向Web服務器驗證自己的身份,因爲會話在此時間後過期。我這樣做的授權:在線程之間做一次事情

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

問題是,身份驗證失敗的多個線程和多個線程想同時進行身份驗證。這會降低進程速度,所以我只想對1個線程進行身份驗證,並希望其他線程等待身份驗證完成。我怎樣才能做到這一點。

+0

搜索[MethodImpl(MethodImplOptions.Synchronized)]或http://stackoverflow.com/questions/391913/re-entrant-locks-in-c-sharp – Ako 2015-03-02 08:04:15

+0

其實,這些都不是我想要的對於。它們用於等待其他線程完成工作的線程。所以每當其他線程結束時,每個線程都會完成這項工作。我想要的是,這項工作必須完成一次。 – 2015-03-02 08:06:49

+0

便宜的解決方案:在所有線程可訪問的布爾之間設置爲true,並在其他線程內部執行一個while循環,並使用合理的時間執行Thread.Sleep,以便不使用比需要更多的容量,然後在你的一個線程完成了認證,你將bool設置爲false。另一個可能對你的問題更清晰的解決方案有用的東西是查看Task.Wait() - 方法https://msdn.microsoft.com/de-de/library/dd537610%28v=vs.110%29 .aspx – 2015-03-02 08:16:17

回答

0

我會做這樣的事情。

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; 
      } 
     } 
    } 
} 
+0

似乎它會工作。我會盡快嘗試。 – 2015-03-02 08:42:34

+0

好的,請記住,您需要處理身份驗證問題。在這個例子中,它會因爲線程調用的遞歸調用而打到stackoverflow。 – Ako 2015-03-02 08:52:30

+0

這減少了完成認證的次數,但並不完美。線程完成身份驗證後,如果另一個線程在catch後面的行中,則可以將身份驗證設置爲false。 – 2015-03-02 09:26:09

相關問題