Какой самый быстрый и лучший способ сделать несколько миллионов запросов SOAP и сохранить результаты в SqlDb
У меня есть миллион записей в моей таблице. Я хочу позвонить в мыльную службу, и мне нужно выполнить обработку всех записей менее чем за час. и кроме того, я должен обновить свою таблицу, вставить запросы и ответы в другие мои таблицы. но код ниже работает менее чем с 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 ответ
Во-первых, это плохая практика async-await
в Parallel.For
- вы вносите только больше нагрузки в планировщик задач и больше накладных расходов.
Во-вторых, вы правы
var selected = List.FirstOrDefault();
List.Remove( selected );
очень, очень неправильно. Ваш код будет вести себя совершенно непредсказуемо из-за условий гонки.