[英]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.
});
}
我嘗試了這個示例代碼,但我無法完成我的工作。 任何專家都可以指導我這樣做嗎?
正如其他人所指出的,您不能將async
與Parallel
一起使用 - 它無法正常工作。 相反,您希望像這樣執行異步並發:
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.