使用ThreadPool或Thread

时间:2011-09-22 18:06:59

标签: c# .net multithreading concurrency threadpool

我有一个集合,我将内容保存到持久存储。然后我最终有3个集合,我想保存到持久存储。

起初我使用ThreadPool来保存一个集合,但现在我有3个集合。由于每个集合都进入不同的存储,我不想将它们组合或保存到同一个地方。

我的问题是我应该使用手动线程并为每个Save()方法创建一个线程,还是应该为每个方法创建3个线程池,或者我应该在一个ThreadPool.QueueUserWorkItem调用中调用所有3个方法。

1.第一种方法

ThreadPool.QueueUserWorkItem(o => 
             { Save<Foo>(ConcurrentCollectionStorage.Bus1);
               Save<Bar>(ConcurrentCollectionStorage.Bus2);
               Save<Car>(ConcurrentCollectionStorage.Bus3);
             });

2.第二种方法

ThreadPool.QueueUserWorkItem(o =>
               { Save<Foo>ConcurrentCollectionStorage.Bus); });  
ThreadPool.QueueUserWorkItem(o =>
               { Save<Bar>(ConcurrentCollectionStorage.Bus2); });  
ThreadPool.QueueUserWorkItem(o =>
               { Save<Car>(ConcurrentCollectionStorage.Bus3); });  

3.第三种方法。手动创建线程并加入它们。

在进行这些操作时,我不希望我的应用程序挂起。我希望它能够处理和保存数据,并完成但不影响前台进程,整个应用程序。

最好的方法是什么?

我应该使用哪一个?有更好的方法吗?

3 个答案:

答案 0 :(得分:3)

  

由于每个集合都进入不同的存储空间,我不想将它们组合起来或保存到同一个地方。

     

在进行这些操作时,我不希望我的应用程序挂起。我希望它能够处理和保存数据,并完成但不影响前台进程,整个应用程序。

在线程池中排队三个线程。

答案 1 :(得分:2)

使用.NET 4.0,您可以使用任务并行库:

    Task.Factory.StartNew(() => { Save<Foo>(ConcurrentCollectionStorage.Bus1); });
    Task.Factory.StartNew(() => { Save<Bar>(ConcurrentCollectionStorage.Bus2); });
    Task.Factory.StartNew(() => { Save<Car>(ConcurrentCollectionStorage.Bus3); });

但是,从您的问题不清楚什么是关键瓶颈。如果您的瓶颈是磁盘IO或网络延迟,则TPL无法帮助您。

如果您希望主线程等待它们全部完成,您可以执行此操作(有多种方法可以执行此操作):

    Task t1 = Task.Factory.StartNew(() => { Save<Foo>(ConcurrentCollectionStorage.Bus1); });
    Task t2 = Task.Factory.StartNew(() => { Save<Bar>(ConcurrentCollectionStorage.Bus2); });
    Task t3 = Task.Factory.StartNew(() => { Save<Car>(ConcurrentCollectionStorage.Bus3); });

    Task.WaitAll(t1,t2,t3);

这样运行任务的线程将一直等到完成。 t1,t2和t3将异步运行。

答案 2 :(得分:1)

如果您使用.net 4,则应使用TASK而不是调用ThreadPool API。 如果您的保存操作很短,请按原样使用。如果它很长,这就是你考虑手动线程的原因,那么你应该使用任务,但将其标记为“长时间运行”

HTH