使用实体框架执行超时过期错误

时间:2017-08-10 15:37:50

标签: c# multithreading entity-framework asynchronous

我的下面的代码开始很好,似乎运行得很快,但后来我会在一段时间后开始收到此错误消息。我意识到实体框架/ Dbcontext不是线程安全的,这可能导致问题,所以是否有一种方法来更改此代码,以便它保持相同的性能,并没有关闭线程可能导致问题的问题还是有另一种方法来加快这个过程?我有超过9000个符号要下载并插入到数据库中,我尝试使用await命令进行基本for循环,但是速度非常慢,并且花费的时间超过10倍才能获得相同的结果。

public static async Task startInitialMarketSymbolsDownload(string market)
{
    try
    {
        List<string> symbolList = new List<string>();
        symbolList = getStockSymbols(market);

        var historicalGroups = symbolList.Select((x, i) => new { x, i })
                  .GroupBy(x => x.i / 50)
                  .Select(g => g.Select(x => x.x).ToArray());

        await Task.WhenAll(historicalGroups.Select(g => Task.Run(() => getLocalHistoricalStockData(g, market))));
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

public static async Task getLocalHistoricalStockData(string[] symbols, string market)
{
    // download data for list of symbols and then upload to db tables
    string symbolInfo = null;

    try
    {
        using (financeEntities context = new financeEntities())
        {
            foreach (string symbol in symbols)
            {
                symbolInfo = symbol;
                List<HistoryPrice> hList = Get(symbol, new DateTime(1900, 1, 1), DateTime.UtcNow);
                var backDates = context.DailyAmexDatas.Where(c => c.Symbol == symbol).Select(d => d.Date).ToList();
                List<HistoryPrice> newHList = hList.Where(c => backDates.Contains(c.Date) == false).ToList<HistoryPrice>();

                foreach (HistoryPrice h in newHList)
                {
                    DailyAmexData amexData = new DailyAmexData();
                    // set the data then add it
                    amexData.Symbol = symbol;
                    amexData.Open = h.Open;
                    amexData.High = h.High;
                    amexData.Low = h.Low;
                    amexData.Close = h.Close;
                    amexData.Volume = h.Volume;
                    amexData.AdjustedClose = h.AdjClose;
                    amexData.Date = h.Date;
                    context.DailyAmexDatas.Add(amexData);
                }

                // now save everything
                await context.SaveChangesAsync();
                Console.WriteLine(symbol + " added to the " + market + " database!");
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.InnerException.Message);
    }
}

0 个答案:

没有答案
相关问题