c#linq to sql两个线程访问同一个数据库,但其中一个非常慢
我已经在我的应用程序中创建了两个线程,第一个是主UI线程,它将完成下面的查询之类的正常工作c#linq to sql两个线程访问同一个数据库,但其中一个非常慢,c#,sql,multithreading,linq,deadlock,C#,Sql,Multithreading,Linq,Deadlock,我已经在我的应用程序中创建了两个线程,第一个是主UI线程,它将完成下面的查询之类的正常工作 var order = db.Orders.Where(x=>x.systemId==id).ToList(); 另一个线程正在检查是否有任何警告情况需要处理,代码如下: TransactionOptions transOptions = new TransactionOptions() { IsolationLevel = System.Transact
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();
}
TransactionOptions transOptions=newtransactionoptions()
{IsolationLevel=System.Transactions.IsolationLevel.ReadUncommitted};
使用(新TransactionScope(TransactionScopeOption.Required,transOptions))
{
BathDBDataContext dc=新的BathDBDataContext(connectionString);
var all_menus=dc.Menu.Where(x=>x.addAutomatic);
var menus=所有菜单。选择(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 id=orders.Select(x=>x.systemId.Distinct();
foreach(ID中的变量systemId)
{
var seat_orders=orders.Where(x=>x.systemId==systemId);
foreach(添加菜单中的变量添加菜单)
{
var add_orders=seat_orders。其中(x=>x.menu==add_menu&&(x.priceType==null | | x.priceType!=“停止计数”);
if(add_orders.Count()==0)
持续
var max\u time=add\u orders.max(x=>x.inputTime);
var max_order=add_orders.OrderByDescending(x=>x.inputTime).FirstOrDefault();
//var max\u order=add\u orders.FirstOrDefault(x=>x.inputTime==max\u time);
if(max_order==null | | max_order.priceType==“每小时”)
持续
var the_menu=all_menu.FirstOrDefault(x=>x.name==add_menu);
string menu\u time=the\u menu.timeLimitHour.ToString()+
“:”+the_menu.timeLimitMiniute.ToString()+
“:”+the_menu.timeLimitSecond.ToString();
TimeSpan tsm=TimeSpan.Parse(菜单\时间);
if(DateTime.Now-最大订单输入时间
在这种情况下,主UI线程中的查询将非常慢,有时甚至无法工作
有人能帮我吗?如果我错了,请纠正我,但您似乎在循环中向订单插入了值,并试图在主UI中使用表达式 此外,5秒的间隔可能很短,因为LINQ表达式变得更复杂,因此计算所需的时间会增加 随着数据库获得新记录,加载“BathDBDataContext”可能需要更多时间。
我建议使用缓存并增加5秒刷新计时器。你是对的,代码已经更新为你所说的那样。第二个线程每5秒运行一次,在这种情况下,其他线程中的查询变得非常缓慢!我如何解决这个问题呢!你永远不应该执行来自UI线程的任何查询。阻止执行长时间运行操作的UI线程会导致糟糕的用户体验。没错!就在看到您的评论之前,我将Interval调整为20秒,它会变得更好!谢谢大家