为什么随着线程数增加,我的多线程示例中的时间会增加

时间:2012-06-18 10:47:20

标签: c# .net winforms multithreading

如何编写在给定线程数下运行程序的多线程Windows应用程序,并显示从每个线程获取的时间结果。我试图创建它,但我可以看到我的程序显示不正确的结果,这意味着当我增加线程数时,每个线程所花费的时间也会增加(如消息框所示)。以下是我的代码:

private static void StartMultithread(long recordsToProcess, string connectionString, string stagingTableName, bool tableLockEnabled, bool transactionEnabled, int batchSize, bool userMultipleDatabases, bool userMultipleTables, bool userMultipleUsers, int bulkInsertTimeout)
 {
 Dictionary<string, Thread> threadPool = new Dictionary<string, Thread>();
 for (int i = 0; i < threadCount; i++)
 {
     Thread thread = new Thread(new ParameterizedThreadStart(delegate(object tid)
     {
         int ii = (int)tid;
         Core.BulkInsert bulkInsert1 = new Core.BulkInsert();
         string result1 = bulkInsert1.Insert(recordsToProcess, connectionString, stagingTableName, tableLockEnabled, transactionEnabled, batchSize, bulkInsertTimeout);
         MessageBox.Show (result1);
     }));

     thread.Name = i.ToString();
     threadPool.Add(thread.Name, thread);
 }

 for (int i = 0; i < threadCount; i++)
 {
     Thread thread = threadPool[i.ToString()];
     thread.IsBackground = true;
     thread.Start(i);
 }

 for (int i = 0; i < threadCount; i++)
 {
     Thread thread = threadPool[i.ToString()];
     thread.Join();
 }
}

因此,当我给threadCount = 1时,所用的时间是0.8秒。 当它为2时,两个线程所花费的时间大约为1.2秒。 当它为3时,它们单独使用的时间约为1.7秒。

bulkinsert1.Insert将记录插入数据库,为每个线程传递不同的表(这样表锁不应该成为插入的瓶颈)

我希望所有线程都花费最少的时间,我认为当threadCount为1时,它应该是0.8秒。

我是线程新手,如果我错了,请纠正我

1 个答案:

答案 0 :(得分:1)

我不确定你是如何计时的,因为从提供的代码中看不出来。

但是,假设bulkInsert1.Insert是IO密集型操作(意味着您的线程主要等待IO操作完成),则在增加线程数时增加完成时间是正常的。您有更多线程,但他们正在使用一些共享资源(例如MB总线,网卡,远程数据库等)。例如,如果数据库处理插入操作需要0.8秒,那么处理两个或多个同时执行相同操作的连接需要更长的时间是正常的 - 特别是如果这些查询由于某种原因碰巧相互阻塞。因此,线程的完成时间会增加。