我正在使用Asp Net和一个列表集合。每个将连接到服务器的客户端都将读取此列表。如果他的ID名称存在于列表中,它将修改或删除ID名称相等的列表行;否则,如果ID名称不存在,它将添加他的ID名称。 我将使用的唯一功能是
Add
Any
ForEach.List
RemoveAll
我不知道列表收集是否是一种好方法。我只想在服务器上进行快速处理,避免读取或写入数据库。
public class Customers
{
public int CustomerID { get; set; }
public string CustomerName { get; set; }
}
List<Customers> myCustomers = new List<Customers>();
// POST: api/Customers
public void Post([FromBody]string value)
{
//read incoming request
if (myCustomers.Any(x => x.CustomerName == "IncomingName"))
myCustomers.RemoveAll(x => x.CustomerName == "IncomingName");
else
myCustomers.Add(new Customers { CustomerID = 1, CustomerName = "IncomingName" });
}
}
服务器上的最大请求数为2000。 请让我知道我是否需要更好的方法。我知道该列表不是安全线程。有什么办法可以处理这个动作? 我可以使用清单锁定功能吗?
答案 0 :(得分:1)
您可以看一下:
BlockingCollection
ConcurrentBag
最简单的是,您可以使用对象变量并执行lock(object)
进行修改操作。
您还可以使用linq来查看不,因为它具有自身的开销,并且运行缓慢,并且坚持使用for循环或foreach循环。
答案 1 :(得分:0)
数据存储-
您将需要将此信息存储在某种数据库中,或者使您的应用程序处于单一状态,因为在请求结束时,您将丢失存储在特定变量中的所有数据。使您的应用程序单例可能会严重影响性能和其他因素。
如果要减少应用程序数据库的负载,可以使用NoSQL数据库存储此类信息。
线程安全-
除非,除非多个线程可以同时访问相同的数据,否则不需要线程安全机制。仅当多个客户端访问同一服务实例时,才有必要实现线程安全。
例如-在单例的情况下,所有客户端都访问同一实例,并且在这种情况下线程安全是强制性的。
答案 2 :(得分:0)
C#List泛型通过使用Synchronized
属性来支持线程安全,但是还有其他几个集合(例如字典)的线程安全版本,在执行您描述的操作类型时,它们可能是某些类型的使用。
这里是描述线程安全原语的文章,并提供了一些指向更具体类型的链接。 https://docs.microsoft.com/en-us/dotnet/standard/collections/thread-safe/
ConcurrentDictionary具有一些不错的线程安全方法,例如GetOrAdd
和AddOrUpdate
,具体取决于您的应用程序。您也可以只使用lock(myCustomers){ ... }
块,这可能足以满足您的目的。