zoukankan      html  css  js  c++  java
  • C#多线程更新,查询MongoDB数据

    对多线程一直在用,但是从来没去深入研究过注意的事项,包括和锁的配合也是一知半解没有真正理解锁(lock)的用法。

    这次在做数据分析是需要将访问的url中host部分记录,如果已经存在就直接匹配id,没有就新增。为了提升效率马上想到的就是多线程,因为程序自身比较复杂,就大篇幅贴代码了。

    主要思路:lock是对实例进行上锁的,如果线程中每个线程都创建了不同的实例那lock的意义也就随之不存在。

    如果涉及到多层类的引用和传递,那就在进程入口处做一次实例化,需要类的初始化或者调用时,一层层去传递直到业务逻辑处理处上锁操作。

    如果对于上边两句话理解起来比较抽象的话,那接下来就这么理解。

    例子:现在需要做一个程序,且使用10个线程,每个线程只需要做一次累加操作,当最终值等于1000时终止程序。

    实现上面例子时,你当然会毫无疑问想到在线程外定义一个全局变量,然后线程中对全局变量lock,一样的道理,在自己的程序中也需要lock这些字段才有意义。

    总之通过上边说的例子去揣摩就可以。

    项目示例代码(抽出关键代码):

    public class CountService
    {
        private static MongoService mdbs;//定义全局字段
    
        public CountService()
            {
              mdbs = new MongoService();//构造函数初始化
            }
        public void Start()
        {
         new VisitsCount(li, _visits.RedisClient, mdbs);//调用另一个业务类需要把示例传递过去
        }
    
    }
    
     public class VisitsCount
        {
    private readonly MongoService dbs;
    
      public VisitsCount(MongoService mdbs=null)
       {
         dbs =mdbs??new BLL.MongoService();
         }
    
             public void Get()
            {
                 lock (dbs)
                    {
                       //写下对mongodb的查询,更新,添加
                       }
            }
        }                    

    多线程调用

    Thread[] VisitsAnalyThreads = new Thread[10];
                for (int i = 0; i < VisitsAnalyThreads.Length; i++)
                {
                    VisitsAnalyThreads[i] = new Thread(MyService.Start) { Name = "访问分析" + (i + 1) + "#" };
                }
                foreach (var VAitem in VisitsAnalyThreads)
                {
                    VAitem.Start();
                }

    这样mongdb的示例被层层传递最终实现多线程的正常操作。

    另外mongdb自身也是支持锁的,但是C#的MongoDB.Driver并没有对其做事物支持 。

    可以通过database.RequestStart();database.RequestDone();但是这个操作知识解决mongdb的并发问题,解决不了多线程上述引起的问题的。

  • 相关阅读:
    Java实现 LeetCode 69 x的平方根
    Java实现 LeetCode 68 文本左右对齐
    Java实现 LeetCode 68 文本左右对齐
    Java实现 LeetCode 68 文本左右对齐
    Java实现 LeetCode 67 二进制求和
    Java实现 LeetCode 67 二进制求和
    Java实现 LeetCode 67 二进制求和
    Java实现 LeetCode 66 加一
    Java实现 LeetCode 66 加一
    CxSkinButton按钮皮肤类
  • 原文地址:https://www.cnblogs.com/loyung/p/7238938.html
Copyright © 2011-2022 走看看