簡體   English   中英

在 Parallel.foreach 中取消后台運行作業

[英]Cancel background running jobs in Parallel.foreach

我有幾個 api 調用的並行 foreach。 Api 會返回一些數據,我可以處理它。 讓我們從前端說,我調用ProcessInsu方法,突然用戶改變主意並轉到其他頁面。 (應該有一個清除按鈕,點擊清除按鈕后用戶可以退出頁面。)調用ProcessInsu方法后,它將在后台運行API。 這是資源浪費,因為用戶已經改變主意並做其他工作。 我需要一些方法來取消后台運行的作業。

public async Task ProcessInsu(InsuranceAccounts insuranceCompAccounts,string resourceId)
{
     ParallelOptions parallelOptions = new ParallelOptions();
     parallelOptions.MaxDegreeOfParallelism = Convert.ToInt32(Math.Ceiling((Environment.ProcessorCount * 0.75) * 2.0));

     Parallel.ForEach(insuranceCompAccounts, parallelOptions, async (insuranceComp) =>
    {
        await Processor.Process(resourceId,insuranceComp); //When looping, From each call, it will call to different different insurance companies.              
    });

} 

我嘗試了這個示例代碼,但我無法完成我的工作。 任何專家都可以指導我這樣做嗎?

正如其他人所指出的,您不能將asyncParallel一起使用 - 它無法正常工作。 相反,您希望像這樣執行異步並發:

public async Task ProcessInsu(InsuranceAccounts insuranceCompAccounts, string resourceId)
{
  var tasks = insuranceCompAccounts.Select(async (insuranceComp) =>
  {
    await Processor.Process(resourceId, insuranceComp);
  }).ToList();
  await Task.WhenAll(tasks);
}

現在代碼已更正,您可以添加取消支持。 例如:

public async Task ProcessInsu(InsuranceAccounts insuranceCompAccounts, string resourceId)
{
  var cts = new CancellationTokenSource();

  var tasks = insuranceCompAccounts.Select(async (insuranceComp) =>
  {
    await Processor.Process(resourceId, insuranceComp, cts.Token);
  }).ToList();
  await Task.WhenAll(tasks);
}

當您准備取消操作時,調用cts.Cancel(); .

請注意, Process現在采用CancellationToken 它應該將此令牌傳遞給它使用的任何 I/O API。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM