Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Web服务将客户端标记为脱机的最佳方法_C#_Web Services - Fatal编程技术网

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

C# 使用Web服务将客户端标记为脱机的最佳方法,c#,web-services,C#,Web Services,目前,我正在使用一个Web服务,在该服务中,客户端应该不断更新数据。 因此WebService有一个客户列表存储连接的客户端的位置: [WebMethod] public string Connect(Size desktopsize) { Client clienti = new Client(); clienti.ID = "Client_" + Counter.ToString(); clienti.Desktopsize = desktopsize; clienti.La

目前,我正在使用一个Web服务,在该服务中,客户端应该不断更新数据。 因此WebService有一个
客户列表存储连接的客户端的位置:

[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分钟前对某个特定客户端进行最后一次更新。(每次更改某个值时,我也会更新更新时间。) 比如:

首先,我在客户端创建了一个线程

private void CheckOnlinestate()
{
  while (isRunning)
  {
    TimeSpan ts = DateTime.Now - lastupdate;
    if (ts.TotalMinutes >= 1)
    {
      isRunning = false;
      this.Dispose();
    }
  }
} 
而不是在WebService上,监视器的if客户端应从列表中删除的线程:

public void CheckClients()
{
  while (true)
  {
    foreach (Client c in clients)
    {
      if (c.ShouldDispose)
      {
        clients.Remove(c);
      }
    }
    Thread.Sleep(200);
  }
}
所以问题是,如何正确地将此方法用于线程,我应该在WebService构造函数中创建并启动线程,还是有更好的方法来实现这一点。
我无法想象如何从
列表客户机中删除特定客户机的最佳方法;

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

您的代码还有一些其他问题。对
计数器
客户端
的访问是不受控制的,线程之间共享这些问题。在访问这些对象时,您应该使用一些同步机制,如
锁定
(如果您已经将
客户机声明为
ConcurrentDictionary
,那么您可以忘记我对
客户机的评论)

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