我正在尝试在应用程序中实现一些多线程代码.此代码的目的是验证数据库提供的项目.验证可能需要相当长的时间(几百毫秒到几秒),因此需要将此过程分解为每个项目的自己的线程.
数据库可能在开始时每秒给它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解决方法 如果您的轻量级零星处理不是时间敏感的,则线程池是一个方便的选择.但是,我记得在MSDN上读到它不适合这种性质的大规模处理.
我把它用于与此非常相似的东西并后悔.我在后续的应用程序中采用了工作线程方法,并且对我的控制水平感到非常高兴.
工作线程模型中我最喜欢的模式是创建一个包含任务项队列的主线程.然后派出一堆工作人员从该队列中d出项目进行处理.我使用阻塞队列,这样当进程中没有项时,工作程序就会阻塞,直到某些东西被推入队列.在此模型中,主线程从某个源(db等)生成工作项,并且工作线程使用它们.
总结以上是内存溢出为你收集整理的在C#中实现多线程(代码审查)全部内容,希望文章能够帮你解决在C#中实现多线程(代码审查)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)