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

时间:2011-11-11 09:33:46

标签: c# web-services

目前,我正在使用Web服务,客户端不断更新数据。 因此,WebService有一个List<Client> clients;,它存储了Connected Client:

[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上监视客户端是否应从列表中删除的线程:

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

所以问题是,如何在WebService构造函数中创建和启动线程,如何正确地将此方法用于线程,或者有更好的方法来执行此操作。 我无法想象如何从List<Client> clients;

中删除特定客户端的最佳方法

1 个答案:

答案 0 :(得分:0)

您可以使用System.Web.HttpRuntime.Cache课程而非实施自己的课程。

您的代码还存在其他一些问题。对Counterclients的访问不受控制,这些访问在线程之间共享。你应该使用一些同步。访问这些对象时lock等机制(如果您已将clients声明为ConcurrentDictionary ,则可以忘记我对{{1}}的评论)