Use ThreadPool or Thread

本文关键字:Thread or ThreadPool Use | 更新日期: 2023-09-27 18:09:36

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

起初我使用ThreadPool来保存一个集合,但现在我有3个集合。因为每个集合去一个不同的存储,我不想合并他们或保存到同一个地方。

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

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.第三种方法。手动创建线程并连接它们

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

最好的方法是什么?

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

Use ThreadPool or Thread

由于每个集合都要到不同的存储,所以我不想将它们合并或保存到同一个位置。

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

将线程池中的三个线程排队

在。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将异步运行

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

HTH