我打電話給一些代碼Parallel.Foreach()
。代碼有Thread.Sleep(60000)
,所以如果我也取消了令牌,那麼它在取消Parallel.ForEach循環之前等待60秒。 Thread.Sleep()
是放在這段代碼中的解釋。實際的代碼有一些等待其他資源的代碼。 我想取消所有活動,因爲調用了cts.Cancel();
。如何立即終止Parallel.ForEach線程?
我也嘗試過LoopState,但它不會在我的情況下工作。
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static void Main()
{
int[] nums = Enumerable.Range(0, 10000000).ToArray();
CancellationTokenSource cts = new CancellationTokenSource();
// Use ParallelOptions instance to store the CancellationToken
ParallelOptions po = new ParallelOptions();
po.CancellationToken = cts.Token;
po.MaxDegreeOfParallelism = System.Environment.ProcessorCount;
Console.WriteLine("Press any key to start. Press 'c' to cancel.");
Console.ReadKey();
// Run a task so that we can cancel from another thread.
Task.Factory.StartNew(() =>
{
if (Console.ReadKey().KeyChar == 'c')
{
cts.Cancel();
}
Console.WriteLine("press any key to exit");
});
try
{
Parallel.ForEach(nums, po, (num) =>
{
double d = Math.Sqrt(num);
Console.WriteLine("{0} on {1}", d, Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(60000); //Thread Sleep for 1 minute
po.CancellationToken.ThrowIfCancellationRequested();
});
}
catch (OperationCanceledException e)
{
Console.WriteLine(e.Message);
}
finally
{
cts.Dispose();
}
Console.ReadKey();
}
}
如果有人告訴你使用'Thread.Abort()',把它們趕走。 –
@MatthewWatson如果main()的所有代碼都在一個線程下運行,那麼Thread.Abort()將工作。 –
你基本上不能這樣做,因爲沒有(理智的)方式來中斷一些不參與合作取消的代碼。通常你會讓線程繼續,但不要再等待它(並忽略它的結果),但是用'Parallel.ForEach'做到這一點並不容易。' –