我正在致力于改进当时需要处理数百万条记录的数据库同步应用程序。我将使用 SqlBulkCopy
操作,然后在数据库上使用 MERGE
将临时表与当前表合并。但在此之前,我创建了几个表,并将它们添加到数据库中。当我使用常规循环时,它工作正常,但是当我创建 Parallel.ForEach
循环时,它处理大约 100 条记录然后挂起。没有错误,什么都没有......我认为它正在达到某种阈值,但不知道如何处理它。当我选择 2 个并行线程时,它工作正常,但它卡住了 > 2 个线程,没有任何错误。
DataTable PRODUCT = new DataTable();
ParallelOptions parOptions = new ParallelOptions();
parOptions.MaxDegreeOfParallelism = 5; //use max (5) threads that are allowed.
Parallel.ForEach(dtPs.AsEnumerable(), parOptions, dtPs_row =>
{
try
{
//some declarations
DataRow newProductRow = PRODUCT.NewRow();
newProductRow.SetField("ID", mId);
newProductRow.SetField("NAME", name);
PRODUCT.Rows.Add(newProductRow);
}
}
最佳答案
这是您的代码示例:
DataTable PRODUCT = new DataTable();
Object lockobj = new Object();
ParallelOptions parOptions = new ParallelOptions();
parOptions.MaxDegreeOfParallelism = 5; //use max (5) threads that are allowed.
Parallel.ForEach(dtPs.AsEnumerable(), parOptions, dtPs_row =>
{
try
{
//some declarations
lock(lockobj)
{
DataRow newProductRow = PRODUCT.NewRow();
newProductRow.SetField("ID", mId);
newProductRow.SetField("NAME", name);
PRODUCT.Rows.Add(newProductRow);
}
}
}
假设 Object lockobj = new Object();
在类级别的方法之外。
关于c# - 使用并行线程时,应用程序卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13887465/