Какой самый быстрый и лучший способ сделать несколько миллионов запросов SOAP и сохранить результаты в SqlDb - PullRequest
0 голосов
/ 26 февраля 2019

В моей таблице миллион записей.Я хочу позвонить в мыльную службу, и мне нужно выполнить обработку всех записей менее чем за час.и кроме того, я должен обновить свою таблицу, вставить запросы и ответы в другие мои таблицы.но приведенный ниже код работает менее чем с 10 записями каждый раз, когда я запускаю свое приложение.

Я знаю, что мой код неверен, я хочу знать, как лучше всего это сделать.

 static async Task Send( )
    {
        var results = new ConcurrentDictionary<string, int>();

        using (AppDbContext entities = new AppDbContext())
        {
            var List = entities.Request.Where(x => x.State == RequestState.InitialState).ToList();

            Parallel.ForEach(Enumerable.Range(0, List.Count), async index =>
            {
                var selected = List.FirstOrDefault();
                 List.Remove( selected );
                var res1 = await DoAsyncJob1(selected);  ///await
               // var res = CallService(selected);
                var res2 = await DoAsyncJob2(selected);  ///await
                var res3 = await DoAsyncJob3(selected); ///await

               // var responses = await Task.WhenAll(DoAsyncJob1, DoAsyncJob2, DoAsyncJob3);

                // results.TryAdd(index.ToString(), res);
            }); 

        }

    }

    static async Task<int> DoAsyncJob1(Request item)
    { 
        using (AppDbContext entities = new AppDbContext())
        {
            var bReq = new BankRequest();
            bReq.Amount = Convert.ToDecimal(item.Amount);
            bReq.CreatedAt = DateTime.Now; 
            bReq.DIBAN = item.DIBAN;
            bReq.SIBAN = item.SIBAN; 
            entities.BankRequest.Add(bReq);
            entities.SaveChanges();
        }
        return item.Id;
    }


static async Task<int> DoAsyncJob2(Request item)
    { 
        using (AppDbContext entities = new AppDbContext())
        {

        }
        return item.Id;
    }


static async Task<int> DoAsyncJob3(Request item)
    { 
        using (AppDbContext entities = new AppDbContext())
        {

        }
        return item.Id;
    }

Возможно, следующие строки неправильны:

  var selected = List.FirstOrDefault();
  List.Remove( selected );

Заранее спасибо ..

1 Ответ

0 голосов
/ 26 февраля 2019

Во-первых, использование async-await в Parallel.For - это плохая практика - вы только увеличиваете нагрузку на планировщик задач и увеличиваете накладные расходы.

Во-вторых, вы правы:

var selected = List.FirstOrDefault();
List.Remove( selected );

очень, очень неправильно.Ваш код будет вести себя совершенно непредсказуемо из-за условий гонки.

...