2016-03-16 35 views
1

我正在開發基於客戶端 - 服務器的應用程序。而且我想限制登錄到我的應用程序的用戶數量 。 我的第一種方法是創建一個表(稱爲「X」),以存儲成功登錄到應用程序的每個用戶的用戶標識,機器名稱,IP .. 。 在每次登錄時,我檢查表格「X」中的行數,如果等於極限 ,那麼我會提醒用戶,如果沒有,我向表格「X」添加一條新記錄,將 當前行存儲爲對象在一個靜態對象中。 當用戶註銷時,我刪除與保存的靜態對象關聯的記錄。 我正在調用刪除formclosing事件中的記錄的功能,這個工作正常,但唯一的問題是,如果我按下「結束任務」或「結束進程」或任何其他異常操作,記錄將保留在表中。 你在這種情況下建議做什麼?併發用戶到Windows窗體應用程序

+1

我想最常見的方法是讓會話在一段時間的沉默之後超時。這確實意味着您的應用程序需要定期發送保持活動的消息。 –

+0

您也可以在後臺線程中發送活動信號,並根據活動連接的數量來決定。 –

回答

1

最好的方法是創建長久的tcp連接到您的服務器並檢測它何時關閉 - 從應用程序終止到網絡的任何原因都會失敗。

如果您的服務器技術不允許創建此類連接。您應該週期性地將「我活着」的數據包從客戶端發送到服務器。如果超時超時,請將此類客戶端標記爲斷開連接。

0

我有一個類似的困境,我決定永遠保留在緩存/數據庫中的一切。 我的解決方案是,我限制緩存大小...(你可以在下面找到我的代碼)

public class CacheWithSizeLimit<TKey,TValue> 
{ 
    private int _cacheSize; 

    public CacheWithSizeLimit(int cacheSize = 10000) 
    { 
     Cache = new ConcurrentDictionary<int, KeyValuePair<TKey, TValue>>(); 
     _cacheSize = cacheSize; 
    } 

    private ConcurrentDictionary<int, KeyValuePair<TKey, TValue>> Cache { get; set; } 

    public TValue GetCachedValue(TKey inputKey) 
    { 
     KeyValuePair<TKey,TValue> result; 
     var key = inputKey.GetHashCode() % _cacheSize; 

     Cache.TryGetValue(key, out result); 

     if (!IsNullOrEmpty(result.Key) && result.Key.Equals(inputKey)) 
     { 
      return result.Value; 
     } 
     return default(TValue); 
    } 

    private bool IsNullOrEmpty<T>(T value) 
    { 
     return EqualityComparer<T>.Default.Equals(value, default(T)); 
    } 

    public void SetCachedValue(TKey inputKey, TValue inputValue) 
    { 
     var key = inputKey.GetHashCode() % _cacheSize; 
     Cache.AddOrUpdate(key, new KeyValuePair<TKey, TValue>(inputKey, inputValue)); 
    } 

    internal void Clear() 
    { 
      Cache = new ConcurrentDictionary<int, KeyValuePair<TKey, TValue>>(); 
    } 
} 

如果這種方法不爲你工作,那麼你可以依靠的實際連接斷開事件或超時。

0

謝謝大家的建議。在與隊友 進一步討論這個問題後,我決定在用戶​​登錄時運行一個小型的後臺應用程序,通過 正確的參數,這個應用程序將爲我做所有的檢查。