发出几百万个 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 );

是非常非常错误的。由于竞争条件,您的代码将以完全不可预测的方式运行。