使用web服务标记客户端脱机的最佳方法

本文关键字:脱机 最佳 方法 客户端 web 服务 使用 | 更新日期: 2023-09-27 18:14:04

目前我正在与客户端不断更新数据的web服务合作。因此,WebService有一个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();
    }
  }
} 

>

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

所以问题是,如何使用这个方法到一个线程正确,我应该创建和启动线程在WebService构造器,或者有一个更好的方法来做到这一点。我无法想象从List<Client> clients;中删除特定客户端的最佳方式

使用web服务标记客户端脱机的最佳方法

您可以使用System.Web.HttpRuntime.Cache类而不是自己实现。

你的代码还有其他一些问题。对Counterclients的访问是不受控制的,它们在线程之间共享。你应该使用一些同步。机制,如lock,而访问这些对象(你可以忘记我对clients的评论,如果你已经声明为ConcurrentDictionary )