我有一种方法可以并行调用WCF服务多次。为了防止目标系统过载,我想使用PLinq的功能来限制并行执行的次数。现在我想知道如何有效地重写我的方法。
这是我当前的实现:
private async Task RunFullImport(IProgress<float> progress) { var dataEntryCache = new ConcurrentHashSet<int>(); using var client = new ESBClient(); // WCF // Progress counters helpers float totalSteps = 1f / companyGroup.Count(); int currentStep = 0; //Iterate over all resources await Task.WhenAll(companyGroup.Select(async res => { getWorkOrderForResourceDataSetResponse worResp = await client.getWorkOrderForResourceDataSetAsync( new getWorkOrderForResourceDataSetRequest( "?", res.Company, res.ResourceNumber, res.ResourceType, res.CLSName, fromDate, toDate, "D" ) ); // Iterate over all work orders and add them to the list foreach (dsyWorkOrder02TtyWorkOrderResource workOrder in worResp.dsyWorkOrder02) { dataEntryCache.Add(workOrder.DataEntryNumber.Value); } // Update progress progress.Report(totalSteps * Interlocked.Increment(ref currentStep) * .1f); })); // Do some more stuff with the result }
我已经尝试了一些使用PLinq的方法,但是我还没有提出适当的解决方案。这是我目前的状态。
var p = companyGroup.Select(res => client.getWorkOrderForResourceDataSetAsync( new getWorkOrderForResourceDataSetRequest( "?", res.Company, res.ResourceNumber, res.ResourceType, res.CLSName, fromDate, toDate, "D" ) ).ContinueWith(worResp => { // Iterate over all work orders and add them to the list foreach (dsyWorkOrder02TtyWorkOrderResource workOrder in worResp.Result.dsyWorkOrder02) { dataEntryCache.Add(workOrder.DataEntryNumber.Value); } // Update progress progress.Report(totalSteps * Interlocked.Increment(ref currentStep) * .1f); })); await Task.WhenAll(p.AsParallel().ToArray());
很明显,这不能正常工作。您是否有任何建议使其正常有效地工作,并将对服务器的最大调用数限制为并行8个?]
我有一种方法可以并行调用WCF服务多次。为了防止目标系统过载,我想使用PLinq的功能来限制并行执行的次数。现在我...
PLINQ仅适用于同步代码。它具有一些不错的内置旋钮,用于控制并发parallel