用PLinq替换Task.WhenAll。]

问题描述 投票:0回答:1

我有一种方法可以并行调用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的功能来限制并行执行的次数。现在我...

c# parallel-processing async-await plinq
1个回答
0
投票

PLINQ仅适用于同步代码。它具有一些不错的内置旋钮,用于控制并发parallel

© www.soinside.com 2019 - 2024. All rights reserved.