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