C# 使用Web服务将客户端标记为脱机的最佳方法
目前,我正在使用一个Web服务,在该服务中,客户端应该不断更新数据。 因此WebService有一个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
客户列表代码>存储连接的客户端的位置:
[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);
}
}