을
William Xifaras 이미 언급했듯이 Parallel.Foreach
또는 Parallel.For
을 사용하면 코드를 실행하는 데 ThreadPool
이 사용됩니다.
Task<T>
을 사용하여 이와 유사한 기능을 작성하지만 이와 같이 취소하는 이유는 무엇입니까?
Action<CancellationToken> work = (token) =>
{
Console.WriteLine($"Work started on Thread: {Thread.CurrentThread.ManagedThreadId}");
foreach (var i in Enumerable.Range(0, 10))
{
if (token.IsCancellationRequested)
{
Console.WriteLine($"Work cancelled on Thread: {Thread.CurrentThread.ManagedThreadId}");
return;
}
Thread.Sleep(1000);
}
Console.WriteLine($"Work complete on Thread: {Thread.CurrentThread.ManagedThreadId}");
};
var tasks = new List<Tuple<Task, CancellationTokenSource>>();
foreach (var i in Enumerable.Range(0, 4))
{
var cancellation = new CancellationTokenSource();
var task = Task.Run(() => work(cancellation.Token), cancellation.Token);
tasks.Add(new Tuple<Task, CancellationTokenSource>(task, cancellation));
}
tasks.First().Item2.Cancel();
Task.WaitAll(tasks.Select(m => m.Item1).ToArray());
이 비슷한 출력을 생성합니다 :
Work started on Thread: 3
Work started on Thread: 6
Work started on Thread: 4
Work started on Thread: 5
Work cancelled on Thread: 3
Work complete on Thread: 6
Work complete on Thread: 5
Work complete on Thread: 4
이 당신이 달성하려고 무엇입니까?
실제로 달성하려는 내용을 설명해 주시겠습니까? 스레드 또는 루프 반복을 중지 하시겠습니까? 정말로 스레드라면, 왜? 'Parallel.ForEach'는 대부분 당신을 위해 쓰레드를 관리합니다. 그렇게 할 필요는 없습니다. – svick