Multi-threading C# : I am finding it difficult to make the following code go any faster. Currently it takes a few hours to update :(

Some background information:
The code selects records from a local database, then updates 3 separate databases all on the same server. When updating the 3 other databases, it does them in single updates.

After updating the records in all 3 database, it them updates the local database with a fresh copy of the data. 

It's basically updating prices, and saving the old price.

I tried implementing Multi-threading, but could not get it to work :(

Here is my code:

    public string ExportPrices(bool _restorePrices = false)
            {
                System.IO.File.AppendAllText(System.Web.HttpContext.Current.Server.MapPath("~/Logs/PriceUpdateErrorList.txt"), "Error Messages" + Environment.NewLine);
    
                var db = new UniStockContext();
                //fetch all databases to export to
                IList<AccDatabase> accDBCol = db.AccDatabases.Where(x => (x.Active == true) && (x.Deleted == false)).ToList();
                //fetch all inventory list
                IList<Domain.Tables.Inventory> inventoryDBCol = db.Inventories.Where(x => (x.Active == true) && (x.Deleted == false)).ToList();
    
                if (inventoryDBCol.Count > 0)
                {
                    //string xmlResult = "<InventoryExportResponse>";
                    //loop through databases and export
                    foreach (AccDatabase accDB in accDBCol)
                    {
                        //check database type and call appropriate accounting system method
                        if ((accDB.Type == AccDatabaseType.SageEvolution) && string.IsNullOrEmpty(accDB.EvolutionCommon))
                        {
                            //////////////////////////////////////////
                            //////////////Sage Evolution//////////////
                            //////////////////////////////////////////
                            foreach (AccDatabase accDB2 in accDBCol)
                            {
                                if ((accDB2.Type == AccDatabaseType.SageEvolution) && !string.IsNullOrEmpty(accDB2.EvolutionCommon))
                                {
                                    //pass db and common db to export method for Sage Evolution
                                    try
                                    {
                                        if (!string.IsNullOrEmpty(accDB.DBName))
                                        {
                                            inventoryDBCol = _sageInventory.ExportPrices(accDB, accDB2, inventoryDBCol, restorPrices: false);//this call updates 13000 records
                                        }
                                    }
                                    catch (Exception exExportPrices)
                                    {
                                        System.IO.File.AppendAllText(System.Web.HttpContext.Current.Server.MapPath("~/Logs/_sageInventoryExportPricesCallError.txt"), exExportPrices.ToString());
                                    }
                                    break;
                                }
                            }
                        }
                    }
                    //end foreach
    
                    //return (xmlResult + "</InventoryExportResponse>");
                }
    
                UpdatePricesFromInventoryListBulk(_inventoryCollection);//this call will update 40000 records in local DB.
    
                return "Stock prices synched to accounting system!";
            }

    public void UpdatePricesFromInventoryListBulk(IList<Domain.Tables.Inventory> invList)
            {
                var db = new UniStockContext();
                db.Configuration.AutoDetectChangesEnabled = false;
    
                foreach (var inventory in invList)
                {
                    Domain.Tables.Inventory _inventory = db.Inventories
                                                        .Single(x => x.InventoryID == inventory.InventoryID);
    
                    if (inventory.Cost.HasValue)
                        _inventory.Cost = inventory.Cost.Value;
                    else
                        _inventory.Cost = 0;
    
                    foreach (var inventoryPrices in inventory.AccInventoryPrices)
                    {
                        foreach (var _inventoryPrices in _inventory.AccInventoryPrices)
                        {
                            if (_inventoryPrices.AccInventoryPriceID == inventoryPrices.AccInventoryPriceID)
                            {
                                _inventoryPrices.ApplyDiscount = inventoryPrices.ApplyDiscount;
                                _inventoryPrices.ApplyMarkup = inventoryPrices.ApplyMarkup;
                                if (inventoryPrices.Price.HasValue)
                                    _inventoryPrices.Price = inventoryPrices.Price.Value;
                                else
                                    _inventoryPrices.Price = _inventory.Cost;
    
                                if (inventoryPrices.OldPrice.HasValue)
                                {
                                    _inventoryPrices.OldPrice = inventoryPrices.OldPrice;
                                }
                            }
                        }
                    }
    
                    db.Inventories.Attach(_inventory);
                    db.Entry(_inventory).State = System.Data.Entity.EntityState.Modified;
                }
    
                db.SaveChanges();
                db.Dispose();
            }