2011-06-09 254 views
1

我有這樣的代碼,在這種情況下,HandleDisconnectEventCB將觸發,當客戶端有一些修改沒有保存的數據和從服務器斷開(刪除網線),然後它會使'clientWithLock = 0 '並將從下面顯示的代碼中刪除集合。但現在的問題是其他連接的客戶端無法更改,它顯示出「clientWithLock」有一些數據不爲零,因爲它會顯示其他用戶正在更新數據請wait.Is有任何badlogic回事爲什麼變量值異常變化

private static int clientWithLock = 0; 

static private void HandleDisconnectEventCB(SPD.SPD_serverLocationType loc, 
              string server, int clientId, 
              object passback) 
{ 
    // Remove lock if necessary 
    if (clientWithLock == clientId) clientWithLock = 0; 

    // Remove client from client list and end replicated display sessions 
    for (int i = 0; i < clients.Count; i++) 
    { 
     SPURTclient sc = (SPURTclient)clients[i]; 
     if (sc.ClientId == clientId) 
     { 
      . 
      . 
      clients.RemoveAt(i); 
      break; 
+0

請更新您的問題,並在您的句子中使用一些標點符號。它很難讀取它... – 2011-06-09 10:13:15

回答

2

如果快速連續發生多個斷開連接,使clientwithlock靜態會導致您所有的頭痛。我建議要麼使整個操作成爲無狀態,所以'ClientWithLock'作爲參數傳遞給事件,並且基於傳遞的所有參數來操作靜態函數。如果'ClientWithLock'被連續更新兩次以斷開連接,行爲將非常奇怪。

或者,實例化整個類和操作,以便斷開處理程序在類的基礎上實例化,如果整個事物無狀態的話不適合你。

+0

我沒有得到你的意思,使整個操作無狀態 – shanethomson11 2011-06-09 10:29:16

+0

有: 私人靜態int clientWithLock = 0; 作爲靜態,正在爲類添加一個狀態,clientWithLock在所有實例中只能有1個值(如果該類是非靜態的,如果該類是靜態的,那麼該類的唯一實例,可以只有一個併發值爲clientWithLock)通過將這個參數作爲你的事件而不是靜態變量,你可以從類中移除'State',在逐個事件的基礎上使用clientWithLock,這更有效率,我懷疑會糾正你所看到的奇怪行爲。 – JTrott 2011-06-09 10:37:06

+0

這裏變量「clientwithlock」和事件HandleDisconnectEven正在類的公共類SPURTServer「未來 – shanethomson11 2011-06-09 10:39:34