關於多線程efcore dbcontext 的解決方案。


  • 首先我們大部分的efcore框架用的DbContext(或者封裝的repo)都是底層注入的上下文容器實體。
  • 然后Dbcontext不是線程安全的,也就是說,你在當前線程中,只能創建一個 DbContext 實例對象(特定情況下),並且這個對象並不能被共享。
  • 當我們使用多線程去執行數據庫的操作時就有可能造成各種問題。

     

  • 我這里就在網站啟動時去跑發布和訂閱任務。
  • 解決方案:使用using從ioc容器中創建新的dbcontext 。然后用完立即釋放。這樣就不會占用主線程的dbContext了。
     /// <summary>
            /// 執行未發布成功的信息
            /// </summary>
            public void ToBePublishs()
            {
                Console.WriteLine("開始執行未發布任務");
                using (var _eventClientDbContext = (EventClientDbContext)ServiceProvider.CreateScope().ServiceProvider.GetService(typeof(EventClientDbContext)))
                {
                    var PublishsList = _eventClientDbContext.Publishs.Where(a => a.PublishStatus == false).ToList();
                    List<Publishs> publishsList = PublishsList.ToList();
                    if (publishsList.Count > 0)
                    {
                        Console.WriteLine("開始執行未發布任務,本次任務執行條數為:" + publishsList.Count());
                        using (var tran = _eventClientDbContext.Database.BeginTransaction())
                        {
                            foreach (var PublishsInfo in publishsList)
                            {
                                //var Result = ClientPost(ClientType.Publishs, PublishsInfo);
                                var Result = string.Empty;
                                try
                                {
                                    Result = ClientPost(ClientType.Publishs, PublishsInfo);
                                    if (Result.Contains("Success"))
                                    {
                                        PublishsInfo.PublishStatus = true;
                                        PublishsInfo.ModifyTime = DateTime.Now;
                                        _eventClientDbContext.Publishs.Update(PublishsInfo);
                                        _eventClientDbContext.SaveChanges();
                                    }
                                }
                                catch (Exception ex)
                                {
                                    Console.WriteLine("執行未發布成功的信息拋出異常:" + ex.StackTrace + ex.Message);
                                    continue;
                                }
                            }
                            tran.Commit();
                        }
                    }
                }
                Console.WriteLine("未發布任務End");
            }

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM