多个线程(客户端)使用的列表集合

时间:2018-10-18 05:52:36

标签: c# asp.net

我正在使用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。 请让我知道我是否需要更好的方法。我知道该列表不是安全线程。有什么办法可以处理这个动作? 我可以使用清单锁定功能吗?

3 个答案:

答案 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具有一些不错的线程安全方法,例如GetOrAddAddOrUpdate,具体取决于您的应用程序。您也可以只使用lock(myCustomers){ ... }块,这可能足以满足您的目的。