2013-05-15 36 views
1

我在我的應用程序中創建兩個線程,第一個是在主UI線程,這將做普通的工作就像查詢下面C#中的LINQ to SQL兩個線程訪問同一個數據庫,但一個是

很慢
 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線程的查詢會很慢,有時沒有按」即使工作。

任何人都可以幫助我嗎?

+0

好,你是對的,代碼已經更新到像什麼üactullay第二個線程運行每5秒,在這種情況下說 – fly

+0

,在其他線程的查詢變得很慢!我怎麼解決這個問題! – fly

+0

你不應該從UI線程*做任何*查詢。阻止UI線程執行長時間運行操作會導致糟糕的用戶體驗。 – Servy

回答

0

糾正我,如果我錯了,但你似乎在循環中插入值,以訂單和也試圖在主界面中使用的表達式。

除了5秒的時間間隔可能會縮短,因爲您的LINQ表達式變得更加複雜,因此計算所需的時間會增加。

加載「BathDBDataContext」可能需要更多時間,因爲數據庫獲取新記錄。 我建議使用緩存並增加5秒刷新計時器。

+0

你是對的!就在看到你的評論之前,我調整了20s的時間,並且它變得更好!感謝所有 – fly

相關問題