在c#的foreach循环中实例化一个线程
本文关键字:一个 线程 实例化 foreach 循环 | 更新日期: 2023-09-27 18:09:55
我有一个连接到多个SQL server实例的函数,从每个服务器获取一组数据,以便在多个环境中比较数据
我有一个连接字符串集合我在foreach循环中为集合
中的每个连接字符串调用此方法由于数据每次从不同的服务器单独获取,因此占用了大量时间我想知道,如果我使用线程调用这个方法,每次会是最好的方式去做吗?
有几种方法可以做到这一点
1.)创建一组任务,然后执行"await Task.WaitAll(listOfTasks)"
2)。使用并行。ForEach
3)。管理线程
管理线程我分两步完成:
1)。创建一个线程列表
List<Thread> threads = new List<Thread>();
foreach(var connectionString in ConnectionStrings)
{
var thread = new Thread(DoWork);
thread.Start(connectionString);
threads.Add(thread);
}
2)。将线程连接到当前线程,具有阻塞的效果,直到所有线程都完成。
foreach(var thread in threads)
{
thread.Join()
}
您可以对线程进行Join
,并让程序等待所有线程直到它们完成。在进入下一步之前,这是一个很好的实践。查看下面带有注释的代码,例如:
// list of threads
List<Thread> threads = new List<Thread>();
// list of the results for each thread
List<SomeTypeDto> results = new List<SomeTypeDto>();
foreach(var connectionString in connectionStringList) {
// create the thread
Thread thread = new Thread(() => {
// access the database
SomeTypeDto result = /* process some result data*/;
lock (results) {
results.Add(result);
}
});
threads.Add(thread);
}
// start all threads
foreach (Thread thread in threads) {
thread.Start();
}
// Wait for all the threads to finish
foreach (Thread thread in threads) {
thread.Join();
}