加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在C#中实现多线程(代码审查)

发布时间:2020-12-15 04:23:59 所属栏目:百科 来源:网络整理
导读:问候. 我正在尝试在应用程序中实现一些多线程代码.此代码的目的是验证数据库提供的项目.验证可能需要相当长的时间(几百毫秒到几秒),因此需要将此过程分解为每个项目的自己的线程. 数据库可能在开始时每秒给它20或30个项目,但开始迅速下降,最终在24小时内达到
问候.

我正在尝试在应用程序中实现一些多线程代码.此代码的目的是验证数据库提供的项目.验证可能需要相当长的时间(几百毫秒到几秒),因此需要将此过程分解为每个项目的自己的线程.

数据库可能在开始时每秒给它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上读到它不适合这种性质的大规模处理.

我把它用于与此非常相似的东西并后悔.我在后续的应用程序中采用了工作线程方法,并且对我的控制水平感到非常高兴.

工作线程模型中我最喜欢的模式是创建一个包含任务项队列的主线程.然后派出一堆工作人员从该队列中弹出项目进行处理.我使用阻塞队列,这样当进程中没有项时,工作程序就会阻塞,直到某些东西被推入队列.在此模型中,主线程从某个源(db等)生成工作项,并且工作线程使用它们.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读