簡體   English   中英

使用Web服務將客戶端標記為脫機的最佳方法

[英]Best way to mark Client Offline using Web-Service

目前,我正在使用Web服務,其中“客戶的持續”應該更新Data。 因此,Web服務具有List<Client> clients; 它存儲連接的客戶端的位置:

[WebMethod]
public string Connect(Size desktopsize)
{
  Client clienti = new Client();
  clienti.ID = "Client_" + Counter.ToString();
  clienti.Desktopsize = desktopsize;
  clienti.Lastupdate = DateTime.Now;
  Counter++;
  clients.Add(clienti);
  return clienti.ID;
}

因此每個客戶都有一個ID,然后繼續更新它的數據。 我需要將客戶端標記為脫機,而不是將特定客戶端的“最近更新”設置為1分鍾前。(每次更改值時,我也會更新UpdateTime,例如:

public bool SingleClick
{
  get
  {
    bool tmpBolean = singleclick;
    singleclick = false;
    return tmpBolean;
  }
  set
  {
    this.lastupdate = DateTime.Now;
    singleclick = value;
  }
}

首先,我曾經在客戶端創建線程

private void CheckOnlinestate()
{
  while (isRunning)
  {
    TimeSpan ts = DateTime.Now - lastupdate;
    if (ts.TotalMinutes >= 1)
    {
      isRunning = false;
      this.Dispose();
    }
  }
} 

而不是WebService上的一個線程,該線程監視Client是否應從列表中刪除:

public void CheckClients()
{
  while (true)
  {
    foreach (Client c in clients)
    {
      if (c.ShouldDispose)
      {
        clients.Remove(c);
      }
    }
    Thread.Sleep(200);
  }
}

因此,問題是,如何正確地在線程中使用此方法,應該在WebService Constructor上創建並啟動線程,還是有一種更好的方法。 我無法想象如何從List<Client> clients;刪除特定客戶端的最佳方法List<Client> clients;

您可以使用System.Web.HttpRuntime.Cache類,而不是實現自己的類。

您的代碼還有其他一些問題。 Counterclients訪問不受控制,這些訪問在線程之間共享。 您應該使用一些同步。 訪問這些對象時使用諸如lock機制( 如果您已經將其聲明為ConcurrentDictionary則可以忘記我對clients評論

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM