Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.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# 在持久对象中修改集合(泛型)会导致异常或数据丢失_C#_.net_Generics_Collections - Fatal编程技术网

C# 在持久对象中修改集合(泛型)会导致异常或数据丢失

C# 在持久对象中修改集合(泛型)会导致异常或数据丢失,c#,.net,generics,collections,C#,.net,Generics,Collections,我有什么 保存在静态变量中并在需要时调用的对象 此对象与另一个应用程序接口 我在这个对象中有两个集合(通用列表) 日志 及 “预检测的数据”供以后使用 问题是当多人试图使用此对象(对象与另一个应用程序接口)时,修改集合会导致异常或数据丢失 循环或使用泛型列表的Find函数时出现异常 我要做的是不时删除预取的数据或日志。我最初可以在调用对象中的任何函数时执行此操作,但如果在两个人(或线程)试图同时调用同一函数时修改集合,则会导致异常或数据丢失 如果我去,数据丢失: List AlreadySave

我有什么

保存在静态变量中并在需要时调用的对象 此对象与另一个应用程序接口

我在这个对象中有两个集合(通用列表) 日志 及 “预检测的数据”供以后使用

问题是当多人试图使用此对象(对象与另一个应用程序接口)时,修改集合会导致异常或数据丢失

循环或使用泛型列表的Find函数时出现异常

我要做的是不时删除预取的数据或日志。我最初可以在调用对象中的任何函数时执行此操作,但如果在两个人(或线程)试图同时调用同一函数时修改集合,则会导致异常或数据丢失

如果我去,数据丢失:

List AlreadySavedData { get { //Rough Syntax maybe incorrect - but in actual application is correct _alreadySavedData= _alreadySavedData.Find(Delegate (Data d {return d.CreatedOn.Date == DateTime.Now.Data;})); return _alreadySavedData; } } 列出AlreadySavedData { 得到 { //粗略的语法可能不正确-但在实际应用中是正确的 _alreadySavedData=_alreadySavedData.Find(委托(数据d{return d.CreatedOn.Date==DateTime.Now.Data;})); 返回_alreadySavedData; } } 我认为,通过上述操作,我至少可以限制我每天收集的“预取数据”或日志。但是,当试图同时访问或修改集合时,有时对“AlreadySavedData”的一个调用可能会覆盖一个可能刚刚修改(添加)集合的并行调用,从而导致数据丢失


如果您必须有多个线程使用该集合以提供同步,我们将非常感谢您的帮助。最简单的方法是:

    protected volatile _alreadySavedData;

    List AlreadySavedData
      {
       get
          {
             lock(_alreadySavedData)
             {
                //Rough Syntax maybe incorrect - but in actual application is correct
               _alreadySavedData= _alreadySavedData.Find(Delegate (Data d {return d.CreatedOn.Date == DateTime.Now.Data;}));               

                return _alreadySavedData;
             }
          }
    }
您需要在修改或使用静态集合的任何位置执行此操作。在多线程应用程序中处理并发性充其量是有问题的

有关该主题的完整说明+指南+建议,请参阅本文:


如果必须有多个线程使用集合,则需要提供同步。最简单的方法是:

    protected volatile _alreadySavedData;

    List AlreadySavedData
      {
       get
          {
             lock(_alreadySavedData)
             {
                //Rough Syntax maybe incorrect - but in actual application is correct
               _alreadySavedData= _alreadySavedData.Find(Delegate (Data d {return d.CreatedOn.Date == DateTime.Now.Data;}));               

                return _alreadySavedData;
             }
          }
    }
您需要在修改或使用静态集合的任何位置执行此操作。在多线程应用程序中处理并发性充其量是有问题的

有关该主题的完整说明+指南+建议,请参阅本文: