c# linq to SQL两个线程访问同一个数据库,但其中一个很慢

本文关键字:一个 数据库 访问 SQL to linq 两个 线程 同一个 | 更新日期: 2023-09-27 18:13:40

我在我的应用程序中创建了两个线程,第一个是主UI线程,它将执行正常的工作,如在

下面查询。
      var order = db.Orders.Where(x=>x.systemId==id).ToList();

另一个线程正在检查是否有需要处理的警告情况,代码如下:

      TransactionOptions transOptions = new TransactionOptions() 
        { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted };
        using (new TransactionScope(TransactionScopeOption.Required, transOptions))
        {
            BathDBDataContext dc = new BathDBDataContext(connectionString);
            var all_menus = dc.Menu.Where(x => x.addAutomatic);
            var menus = all_menus.Select(x => x.name).ToList();
            var orders = dc.Orders.Where(x => menus.Contains(x.menu) && !x.paid && x.deleteEmployee == null);
            var add_menus = orders.Select(x => x.menu).Distinct();
            var ids = orders.Select(x => x.systemId).Distinct();
            foreach (var systemId in ids)
            {
                var seat_orders = orders.Where(x => x.systemId == systemId);
                foreach (var add_menu in add_menus)
                {
                    var add_orders = seat_orders.Where(x => x.menu == add_menu && (x.priceType == null || x.priceType != "stop counting"));
                    if (add_orders.Count() == 0)
                        continue;
                    var max_time = add_orders.Max(x => x.inputTime);
                    var max_order = add_orders.OrderByDescending(x => x.inputTime).FirstOrDefault();
                    //var max_order = add_orders.FirstOrDefault(x => x.inputTime == max_time);
                    if (max_order == null || max_order.priceType == "per hour")
                        continue;
                    var the_menu = all_menus.FirstOrDefault(x => x.name == add_menu);
                    string menu_time = the_menu.timeLimitHour.ToString() +
                        ":" + the_menu.timeLimitMiniute.ToString() +
                        ":" + the_menu.timeLimitSecond.ToString();
                    TimeSpan tsm = TimeSpan.Parse(menu_time);
                    if (DateTime.Now - max_order.inputTime < tsm)
                        continue;
                    if (the_menu.addType == "by unit")
                    {
                        Orders new_order = new Orders();
                        new_order.menu = max_order.menu;
                        new_order.text = max_order.text;
                        new_order.systemId = systemId;
                        new_order.number = 1;
                        new_order.money = the_menu.price;
                        new_order.technician = max_order.technician;
                        new_order.techType = max_order.techType;
                        new_order.inputTime = DateTime.Now;
                        new_order.inputEmployee = "computer";
                        new_order.paid = false;
                        dc.Orders.InsertOnSubmit(new_order);
                    }
                    else if (the_menu.addType == "by time")
                    {
                        Orders new_order = new Orders();
                        new_order.menu = max_order.menu;
                        new_order.text = max_order.text;
                        new_order.systemId = systemId;
                        new_order.number = 1;
                        new_order.priceType = "per hour";
                        new_order.money = Convert.ToDouble(the_menu.addMoney);
                        new_order.technician = max_order.technician;
                        new_order.techType = max_order.techType;
                        new_order.inputTime = DateTime.Now;
                        new_order.inputEmployee = "computer";
                        new_order.paid = false;
                        dc.Orders.InsertOnSubmit(new_order);
                    }
                }
                dc.SubmitChanges();
            }

在这种情况下,主UI线程中的查询将非常缓慢,有时甚至无法工作。

有谁能帮我吗?

c# linq to SQL两个线程访问同一个数据库,但其中一个很慢

如果我错了,请纠正我,但您似乎在循环中向订单插入值,并试图在主UI中使用表达式。

此外,5秒的间隔可能很短,因为您的LINQ表达式变得更复杂,因此计算所需的时间增加了。

加载"BathDBDataContext"可能需要更多的时间,因为您的数据库获得新的记录。我建议使用缓存并增加5秒刷新定时器。