将数据存储在 WCF 的全局集合中
store data in a global collection in WCF
我有一个 WCF,ASP.NET 应用程序每 10-15 分钟调用一次,以通过电子邮件通知客户有关内容。我需要集合来识别邮件已经发送给哪个用户。因此,如果下一个电话打进来,我可以查询这个集合,如果邮件是在上次发送之前和最后一次发送的时间(我设置了一个时间间隔,这样用户就不会每 10-15 分钟收到一次邮件)。
我的问题是 - 当我将它存储在全局时,此集合是否会在调用结束时过期(集合 = 空)?
将 .svc class 中的这个全局集合设置为静态列表就足够了吗?还是我必须设置 DataMember 属性?
代码将如何寻找它?
像那样?
public class Service1 : IService1
{
private static List<customer> lastSendUserList = new List<customer>();
void SendMail(int customerid)
{
lastSendUserList.FirstOrDefault(x => x.id == customerid);
.
// proof date etc. here and send or send not
}
}
这个 lastSendUserList
是否会保留在 ram/cache 直到我将它设置为 null
(或服务器重启等)以便我可以在每次来电时查询它?还是每次调用结束时这个列表都会被 gc 清除?
编辑
所以新代码应该是这样的?!
public class Service1 : IService1
{
private static List<customer> lastSendUserList = new List<customer>();
void SendMail(int customerid, int setInterval)
{
customer c;
c = lastSendUserList.FirstOrDefault(x => x.id == customerid);
if(c != null && c.lastSendDate + setInterval > DateTime.Now)
{
lastSendUserList.Remove(x => x.id == c.id);
// start with sending EMAIL
lastSendUserList.Add(new customer() { id = customerid, lastSendDate = DateTime.Now });
}
}
}
假设您添加到lastSendUserList
它将始终可用,直到 IIS stops/restarts 您的工作进程。
希望customer
有LastSendDate
!!!
此外,您应该 trim 最后一个,以免它变得太大。所以我的代码看起来像。
TimeSpan const ttl = TimeSpan.FromMinutes(15);
lock (lastSendUserList)
{
lastSendUserList.Remove(x => x.lastSendDate + ttl < DateTime.Now);
if (lastSendUserList.Any(x => x.id == customerid))
return;
}
// ... send the email
lock (lastSendUserList)
{
customer.lastSendDate = DateTime.Now;
lastSendUserList.Add(c);
}
由于您在 WCF 服务中,因此您必须是线程安全的。这就是为什么我在 lastSendUserList
周围有一个 lock
。
我有一个 WCF,ASP.NET 应用程序每 10-15 分钟调用一次,以通过电子邮件通知客户有关内容。我需要集合来识别邮件已经发送给哪个用户。因此,如果下一个电话打进来,我可以查询这个集合,如果邮件是在上次发送之前和最后一次发送的时间(我设置了一个时间间隔,这样用户就不会每 10-15 分钟收到一次邮件)。
我的问题是 - 当我将它存储在全局时,此集合是否会在调用结束时过期(集合 = 空)? 将 .svc class 中的这个全局集合设置为静态列表就足够了吗?还是我必须设置 DataMember 属性? 代码将如何寻找它?
像那样?
public class Service1 : IService1
{
private static List<customer> lastSendUserList = new List<customer>();
void SendMail(int customerid)
{
lastSendUserList.FirstOrDefault(x => x.id == customerid);
.
// proof date etc. here and send or send not
}
}
这个 lastSendUserList
是否会保留在 ram/cache 直到我将它设置为 null
(或服务器重启等)以便我可以在每次来电时查询它?还是每次调用结束时这个列表都会被 gc 清除?
编辑
所以新代码应该是这样的?!
public class Service1 : IService1
{
private static List<customer> lastSendUserList = new List<customer>();
void SendMail(int customerid, int setInterval)
{
customer c;
c = lastSendUserList.FirstOrDefault(x => x.id == customerid);
if(c != null && c.lastSendDate + setInterval > DateTime.Now)
{
lastSendUserList.Remove(x => x.id == c.id);
// start with sending EMAIL
lastSendUserList.Add(new customer() { id = customerid, lastSendDate = DateTime.Now });
}
}
}
假设您添加到lastSendUserList
它将始终可用,直到 IIS stops/restarts 您的工作进程。
希望customer
有LastSendDate
!!!
此外,您应该 trim 最后一个,以免它变得太大。所以我的代码看起来像。
TimeSpan const ttl = TimeSpan.FromMinutes(15);
lock (lastSendUserList)
{
lastSendUserList.Remove(x => x.lastSendDate + ttl < DateTime.Now);
if (lastSendUserList.Any(x => x.id == customerid))
return;
}
// ... send the email
lock (lastSendUserList)
{
customer.lastSendDate = DateTime.Now;
lastSendUserList.Add(c);
}
由于您在 WCF 服务中,因此您必须是线程安全的。这就是为什么我在 lastSendUserList
周围有一个 lock
。