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

时间:2015-08-26 20:40:00

标签: c# multithreading

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

我有一组连接字符串 我在foreach循环中为集合中的每个连接字符串调用此方法

由于数据是从不同的服务器中逐个获取的,因此一次占用大量时间 我想知道我是否每次使用线程调用此方法最好的方法是什么?

2 个答案:

答案 0 :(得分:4)

有几种方法可以做到这一点

1。)创建一组任务,然后执行“await Task.WaitAll(listOfTasks)”

2。)使用Parallel.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()
}

答案 1 :(得分:1)

您可以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();
}