はこのexample (MSDN)のようにCancellationTokenを使用してみてください。 )
CancellationTokenSourceのCTS =新しいCancellationTokenSource(;:
このような何かを試してみてください
// Use ParallelOptions instance to store the CancellationToken
ParallelOptions po = new ParallelOptions();
po.CancellationToken = cts.Token;
po.MaxDegreeOfParallelism = Environment.ProcessorCount;
try
{
Parallel.ForEach<ListViewItem>(filesListView.Items.Cast<ListViewItem>(), po, item => {
// po.CancellationToken.ThrowIfCancellationRequested(); //1
if (CallToStop == true)
{
//Code here to stop the loop!
cts.Cancel();
}
if (po.CancellationToken.IsCancellationRequested == false)
{
internalProcessStart(item);
}
});
}
catch (OperationCanceledException e)
{
// handle
}
finally
{
cts.Dispose();
}
またはその代わりに、直接CallToStop = true
コールcts.Cancel()
を設定します。
// 1を終了し、終了していないすべてのスレッドをスローしますOperationCanceledException(CallToStop = true
がエラーのためにすべての並列スレッドを停止している場合のみ使用します)。
cts.Token
をinternalProcessStart(item,token)
に渡して、内部プロセスが既に実行されているときに取り消すとどうするかを処理することもできます。
Parallel.ForEach<ListViewItem>(filesListView.Items.Cast<ListViewItem>(), new ParallelOptions() { MaxDegreeOfParallelism = Environment.ProcessorCount }, (item, state) => {
if (CallToStop == true)
{
state.Break();
}
internalProcessStart(item);
});
・ホープ、このことができます以下のように
ForEachループ本体でも編集できますか? –
@KevinLe OK、完了! – user2924019