问候.
我正在尝试在应用程序中实现一些多线程代码.此代码的目的是验证数据库提供的项目.验证可能需要相当长的时间(几百毫秒到几秒),因此需要将此过程分解为每个项目的自己的线程.
数据库可能在开始时每秒给它20或30个项目,但开始迅速下降,最终在24小时内达到约65K项目,此时应用程序退出.
如果有更多知识渊博的人可以查看我的代码并查看是否有任何明显的问题,我会喜欢它.我工作过的任何人都不知道多线程,所以我真的只靠我自己,就这个.
这是代码.它有点长但应该很清楚.如果您有任何反馈或建议,请告诉我.谢谢!
public class ItemValidationService
{
/// <summary>
/// The object to lock on in this class, for multithreading purposes.
/// </summary>
private static object locker = new object();
/// <summary>Items that have been validated.</summary>
private HashSet<int> validatedItems;
/// <summary>Items that are currently being validated.</summary>
private HashSet<int> validatingItems;
/// <summary>Remove an item from the index if its links are bad.</summary>
/// <param name="id">The ID of the item.</param>
public void ValidateItem(int id)
{
lock (locker)
{
if
(
!this.validatedItems.Contains(id) &&
!this.validatingItems.Contains(id)
){
ThreadPool.QueueUserWorkItem(sender =>
{
this.Validate(id);
});
}
}
} // method
private void Validate(int itemId)
{
lock (locker)
{
this.validatingItems.Add(itemId);
}
// *********************************************
// Time-consuming routine to validate an item...
// *********************************************
lock (locker)
{
this.validatingItems.Remove(itemId);
this.validatedItems.Add(itemId);
}
} // method
} // class
Run Code Online (Sandbox Code Playgroud)
如果您有对时间不敏感的轻量级零星处理,那么线程池是一个方便的选择。然而,我记得在 MSDN 上读到它不适合这种性质的大规模处理。
我用它来做与此非常相似的事情并后悔了。我在后续应用程序中采用了工作线程方法,并且对我所拥有的控制水平感到非常满意。
在工作线程模型中我最喜欢的模式是创建一个主线程来保存任务项队列。然后分叉一批工作人员,将项目从队列中弹出以进行处理。我使用阻塞队列,这样当进程中没有项目时,工作人员就会阻塞,直到有东西被推入队列。在此模型中,主线程从某些源(数据库等)生成工作项,而工作线程使用它们。
归档时间: |
|
查看次数: |
4098 次 |
最近记录: |