发出几百万个 SOAP 请求并将结果保存到 SqlDb 中的更快、最好的方法是什么
what is the faster and best way to make a few million SOAP requests and save the results into SqlDb
我的 table 中有一百万条记录。我想调用 soap 服务,我需要在不到一小时内处理所有记录。此外,我应该更新我的 table ,在我的其他 table 中插入请求和响应。但是每次我 运行 我的应用程序时,下面的代码都适用于少于 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 );
提前致谢..
首先,在 Parallel.For
中使用 async-await
是一种不好的做法 - 您只会给任务计划程序带来更多负载和更多开销。
其次,你说得对:
var selected = List.FirstOrDefault();
List.Remove( selected );
是非常非常错误的。由于竞争条件,您的代码将以完全不可预测的方式运行。
我的 table 中有一百万条记录。我想调用 soap 服务,我需要在不到一小时内处理所有记录。此外,我应该更新我的 table ,在我的其他 table 中插入请求和响应。但是每次我 运行 我的应用程序时,下面的代码都适用于少于 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 );
提前致谢..
首先,在 Parallel.For
中使用 async-await
是一种不好的做法 - 您只会给任务计划程序带来更多负载和更多开销。
其次,你说得对:
var selected = List.FirstOrDefault();
List.Remove( selected );
是非常非常错误的。由于竞争条件,您的代码将以完全不可预测的方式运行。