2011-10-19 12 views
0

我有一個Windows窗體中執行tcp/IP套接字連接並保持連接打開的私人對象變量。避免重複調用勝利表單中多個線程的例程?

在form_load上,此對象被初始化,並且表單中有15-20個線程持續運行,它可以訪問此對象。有些情況下Tcp/Ip連接可能會丟失。因此,每當我發現連接丟失時,我都會在線程中調用ReconnectToSocket()方法。我正在執行下面的代碼以確保ReconnectToSocket()方法僅通過使用_ReconnectingSocket屬性被調用一次。但在檢查文本日誌文件後,我發現這個方法在每個子線程中被調用。

如何確保只調用一次此方法並避免重複調用。

以下是我的代碼。我對任何其他方法感興趣,因爲我覺得這不是正確的做法。

bool _bReconnectingSocket = false;//To check if it is currently reconnecting 
    readonly object lock_reconnectSocket = new object(); 
    private bool _ReconnectingSocket 
    { 
     get 
     { 
      lock (lock_reconnectSocket) 
      { 
       return this._bReconnectingSocket; 
      } 
     } 
     set 
     { 
      lock (lock_reconnectSocket) 
      { 
       this._bReconnectingSocket = value; 
      } 
     } 
    } 


    private void ReconnectToSocket() 
    { 
     if (!this._ReconnectingSocket) 
     { 
      this._ReconnectingSocket = true; 

      //Each sub thread checks for this variable while looping and exits from the infinite loop 
      this._Stop = true; 

      //Join all the Sub Threads Before Reconnecting 
      foreach (SocketThread thrd in this._subThreadCol) 
      { 
       try 
       { 
        this._objLog.WriteInfo(string.Format("Joining Subthread - {0} for Reconnecting.", thrd.ThrdID)); 
        thrd.Join(); 
       } 
       catch { } 
      } 

      this.ConnectSocket(); 

      this._ReconnectingSocket = false; 
      this._Stop = false; 
     } 
    } 
+0

這看起來很腥。您不能隱藏連接丟失到主動傳輸數據的線程的事實。傳輸無法完成,必須重新啓動。有些事故對於解決問題太有影響。使用15個線程在這裏沒有多大意義。線程爲您購買更多的CPU週期,它不會使線路另一端的機器更快。 –

回答

1

試着在你的課堂上寫下類似的東西。你的例程可能會被多次調用,但如果reconnected字段是錯誤的,它的實際主體一次只能執行一次。

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

void ReconnectToSocket() 
{ 
    lock(lockObject) 
    { 
    if(!reconnected) { /*do stuff*/; reconnected = true; } 
    } 
} 
+0

如果使用鎖定,並且在一個場景中,其中5個線程同時調用例程ReconnectToSocket(),並且第一個獲取Lock,然後重新調用4等待它。一旦第一個完成,那麼第二個將獲得並再次執行相同的任務。我想避免這種情況。 – HishHash

+1

你是對的,所有的線程最終都會獲得一個鎖,但是由於'if(!reconnected)'條件,他們將釋放它而不執行任何任務。 – Dmitriy

+0

讓我得到這個方法的實施和測試。 – HishHash

1

嗨你鎖定的對象應該是類的靜態私有而不是實例成員。我不確定的一件事是爲什麼你在線程之間共享相同的連接,而不是讓每個線程打開,使用並立即關閉自己的線程,就像我們使用SqlConnection一樣。

+0

我需要堅持不斷的連接。使用連接傳遞每5-10秒的消息和指令。所以我不想打開和關閉連接,也不爲每個線程保留不同的對象。 – HishHash