在C#中,我很感興趣,停止一個Parallel.ForEachAsync回圈(考慮之間的差異Stop和Break); 因為Parallel.ForEach我可以做到以下幾點:
Parallel.ForEach(items, (item, state) =>
{
if (cancellationToken.IsCancellationRequested)
{
state.Stop();
return;
}
// some process on the item
Process(item);
});
但是,由于我有一個需要異步執行的行程,所以我切換到使用Parallel.ForEachAsync. 在ForEachAsync沒有Stop()方法,我能break回圈,如下,但我想知道,如果這打破了一下(換句話說,最有效的方式,回圈需要停止盡快當它收到取消請求)。
await Parallel.ForEachAsync(items, async (item, state) =>
{
if (cancellationToken.IsCancellationRequested)
{
return;
}
// some async process on the item
await ProcessAsync(item);
});
uj5u.com熱心網友回復:
該Parallel.ForEachAsync拉姆達有一個CancellationToken作為其第二個引數。此令牌由 API 提供,它與您在ParallelOptions. 您可以將此令牌轉發到您在 lambda 中呼叫的任何異步方法。如果你呼叫不可取消的方法,那么你能做的最好的就是呼叫ThrowIfCancellationRequestedlambda 中的at 策略位置:
var cts = new CancellationTokenSource();
var options = new ParallelOptions() { CancellationToken = cts.Token };
try
{
await Parallel.ForEachAsync(items, options, async (item, ct) =>
{
//...
ct.ThrowIfCancellationRequested();
//...
await ProcessAsync(item, ct);
//...
ct.ThrowIfCancellationRequested();
//...
});
}
catch (OperationCanceledException ex)
{
// ...
}
uj5u.com熱心網友回復:
你將需要這樣的東西:
await Parallel.ForEachAsync(items, async (item, state) =>
{
await ProcessAsync(item, cancellationToken);
});
async Task ProcessAsync(string item, CancellationToken ct)
{
while (!ct.IsCancellationRequested)
{
//Process
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/421106.html
標籤:
