C# 为什么在我的多线程示例中,时间随着线程数的增加而增加
如何编写在给定线程数下运行程序的多线程windows应用程序,并显示每个线程的时间结果。我试图创建它,但我可以看到我的程序显示不正确的结果,这意味着当我增加线程数时,每个线程所花费的时间也会增加(如消息框所示)。以下是我的代码:C# 为什么在我的多线程示例中,时间随着线程数的增加而增加,c#,.net,winforms,multithreading,C#,.net,Winforms,Multithreading,如何编写在给定线程数下运行程序的多线程windows应用程序,并显示每个线程的时间结果。我试图创建它,但我可以看到我的程序显示不正确的结果,这意味着当我增加线程数时,每个线程所花费的时间也会增加(如消息框所示)。以下是我的代码: private static void StartMultithread(long recordsToProcess, string connectionString, string stagingTableName, bool tableLockEnabled, bo
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();
}
}
private static void StartMultithread(长记录停止进程、字符串连接字符串、字符串stagingTableName、bool tableLockEnabled、bool transactionEnabled、int batchSize、bool UserMultipleDatabase、bool userMultipleTables、bool userMultipleUsers、int bulkInsertTimeout)
{
字典线程池=新字典();
对于(int i=0;i
因此,当我给出threadCount=1时,所用时间为0.8秒。
当它为2时,两个线程所花费的时间各约为1.2秒。
当值为3时,它们各自花费的时间约为1.7秒
Insert将记录插入数据库,对于我正在传递不同表的每个线程(这样表锁就不会成为插入的瓶颈)
我希望所有线程都需要最短的时间,我想当threadCount为1时,应该是0.8秒
我是线程新手,如果我在任何地方出错,请纠正我,我不确定您是如何计时的,因为从提供的代码中看不明显
但是,假设
bulkInsert1.Insert
是一个IO密集型操作(意味着您的线程主要等待IO操作完成),则随着线程数量的增加,完成时间增加是正常的。您有更多线程,但它们使用一些共享资源(例如MB总线、网卡、远程数据库等)。例如,如果数据库处理insert操作需要0.8秒,则处理两个或多个同时执行相同操作的连接需要更长的时间是正常的,尤其是当这些查询由于某种原因而相互阻塞时。因此,线程的完成时间会增加。您有多少个CPU内核?如果您只有一个CPU,那么任何线程在任何时间都只能运行一个CPU。您至少需要两个内核才能看到这方面的任何改进。创建线程需要一些时间。改为使用System.Threading.ThreadPool.QueueUserWorkItem,这样您将在应用程序启动时使用CLR已创建的线程。顺便问一下,您使用什么类来测量时间?如果您还没有,您可能应该使用System.Diagnostics.Stopwatch。我正在使用相同的Stopwatch坏标题。你应该问为什么时间在增加。由于共享资源,时间增加。bulkinsert1将记录插入数据库,对于每个线程,我传递不同的表(这样表锁就不会成为插入的瓶颈)@ImranRizvi如前所述,阻塞只是一个示例。不同的表并不意味着没有其他共享资源。