在c#的foreach循环中实例化一个线程

本文关键字:一个 线程 实例化 foreach 循环 | 更新日期: 2023-09-27 18:09:55

我有一个连接到多个SQL server实例的函数,从每个服务器获取一组数据,以便在多个环境中比较数据

我有一个连接字符串集合我在foreach循环中为集合

中的每个连接字符串调用此方法

由于数据每次从不同的服务器单独获取,因此占用了大量时间我想知道,如果我使用线程调用这个方法,每次会是最好的方式去做吗?

在c#的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();
}