C# 将列表传递到任务中

C# 将列表传递到任务中,c#,multithreading,c#-4.0,task-parallel-library,C#,Multithreading,C# 4.0,Task Parallel Library,我是C#和线程的新手,这是一个非常简单的问题,但我真的被卡住了。我确实在该网站上搜索过,但找不到与我的情况类似的答案: 我有一个方法,比如Parent(),每次我把它传递给任务时,我都会创建一个类型化列表。我有一个问题,什么时候清除列表并释放内存,因为它一直在增长。我尝试在任务结束时清除列表,如果使用父方法清除列表,则该列表在线程中为空 有人能帮我吗?我知道这是一个非常简单的问题,但如果能得到帮助,我将不胜感激 public void Parent() { List&l

我是C#和线程的新手,这是一个非常简单的问题,但我真的被卡住了。我确实在该网站上搜索过,但找不到与我的情况类似的答案:

我有一个方法,比如Parent(),每次我把它传递给任务时,我都会创建一个类型化列表。我有一个问题,什么时候清除列表并释放内存,因为它一直在增长。我尝试在任务结束时清除列表,如果使用父方法清除列表,则该列表在线程中为空

有人能帮我吗?我知道这是一个非常简单的问题,但如果能得到帮助,我将不胜感激

    public void Parent()
    {
     List<MyType> list = new List<MyType>();
     for (int i = 0; i< N; i++)
     {
        list.Add(new MyType {Var = "blah"});

      if ( i% 10 == 0) //every tentth time we send a task out tou a thread
      {
       Task.Factory.StartNew(() => WriteToDB(new List<MyType>(list))); 
       //here I am              sending a new instance of the list

        //Task.Factory.StartNew(() => WriteToDB((list))); 
        //here I am sending same instance

        list.Clear();

         //if I clear here the list sent to the WriteToDB is empty
        //if I do not, the memory keeps growing up and crashes the app 
      }

      private void WriteToDB(List<MyType> list)
      {
       //do some calculations with the list 
       //insert into db 
       list.Clear(); 
      }
     }
   }
public void Parent()
{
列表=新列表();
对于(int i=0;iWriteToDB(新列表(List));
//在这里,我将发送列表的一个新实例
//Task.Factory.StartNew(()=>WriteToDB((列表));
//这里我发送相同的实例
list.Clear();
//如果我在此处清除,则发送到WriteToDB的列表为空
//如果我不这样做,内存就会不断增长,导致应用程序崩溃
}
私有void WriteToDB(列表)
{
//用列表做一些计算
//插入数据库
list.Clear();
}
}
}

只需在启动线程之前创建新列表:

var newList = new List<MyType>(list);
Task.Factory.StartNew(() => WriteToDB(newList)); 
list.Clear();
var newList=新列表(List);
Task.Factory.StartNew(()=>WriteToDB(newList));
list.Clear();

这样,新的列表在新线程启动之前就准备好了,因此可以安全地立即清除原始列表。

您遇到了一个关闭错误

lambda
()=>WriteToDB(新列表(列表))
在新的
任务启动之前不会执行。
这有时会在您调用
list.Clear()
之后发生

修复方法是捕获lambda之外的列表副本:

var chunk = new List<MyType>(list);
Task.Factory.StartNew(() => WriteToDB(chunk));

list.Clear();
var chunk=新列表(列表);
Task.Factory.StartNew(()=>WriteToDB(chunk));
list.Clear();
如果(i%10==0)//每十次我们向线程发送任务
{
//在开始任务之前克隆列表
var listToProcess=新列表(列表);
list.Clear();
Task.Factory.StartNew(()=>WriteToDB(listToProcess));
}

您可以显示完整的类定义吗?同时,您似乎正在将一个方法嵌套在另一个方法中,我是该类的父类..?谢谢,我收到一个错误。这意味着父方法正在修改集合,因为任务操作仍在运行。System.InvalidOperationException:集合已修改;枚举操作不能执行。在System.Collections.Generic.List
1.Enumerator.MoveNextRare()的System.Linq.Enumerable.WhereSelectListIterator
2.MoveNext()@Santino-hm中,必须有更多的代码没有显示。您是否在某处使用了
Where
子句?不,我正在编写的代码非常简单。IDNK“where子句”是什么。在Lambda?Santino我真的不知道。也许在“做一些计算”部分的某个地方。我唯一能建议的另一件事是尝试删除
WriteToDB
方法中的
list.Clear()
——您不需要它,它是一个本地对象,无论如何都会被垃圾处理。
if ( i% 10 == 0) //every tentth time we send a task out tou a thread
{
   // clone your list before starting the task
   var listToProcess = new List<MyType>(list);
   list.Clear();

   Task.Factory.StartNew(() => WriteToDB(listToProcess)); 
}