【发布时间】:2010-07-27 02:40:16
【问题描述】:
我的程序有一个包含 200k 文件的列表。我必须将每个导入数据库。我花了很长时间,所以我开始研究多线程作为加快导入过程的一种手段。我终于实现了,但我不确定它是否真的有效。
使用Workaround for the WaitHandle.WaitAll 64 handle limit? 作为我的 c# 代码示例后,我想出了:
int threadCount = 0;
for (int i = 0; i < this.Total; i++)
{
Finished = new ManualResetEvent(false);
threadCount = this.ThreadCount;
Interlocked.Increment(ref threadCount);
FileHandler fh = new FileHandler(finished, sorted[i], this.PicturesFeatures, this.Outcome, this.SiteIds, this.LastId, this.Order, this.ThreadCount);
Console.Write(i + " ");
ThreadPool.QueueUserWorkItem(new WaitCallback(HandleFile), fh);
Console.Write(i + " ");
Finished.WaitOne();
}
HandleFile() 如下:
private void HandleFile(object s)
{
try
{
//code
}
finally
{
if (Interlocked.Decrement(ref threadCount) == 0)
{
Finished.Set();
}
}
}
我已经把那些控制台写了,如果一个进程更长,它会比其他进程更晚完成(“0 0 1 2 2 1 3 3 ...”),但它总是有序的(“0 0 1 1 2 2 3 3 4 4 ...")
【问题讨论】:
-
我想说一句:你确定你的代码花时间计算东西,而不是文件 I/O 和数据库操作?否则,请注意并行执行可能不会过多地加速您的代码这一事实(即,并行读取文件并不比逐个读取文件更快;除非文件存储在不同的硬盘上磁盘)。
-
是的,但是数据库呢?每个线程打开一个不同的数据库连接,所以如果我使用并行,它应该会加快速度。
-
不太确定。测试看看会发生什么。在所有情况下,如果瓶颈是磁盘 I/O 操作(本地或数据库级别),实现并行只会减慢速度。
标签: c# multithreading