using System;
using System.Threading;
using System.Threading.Tasks;

namespace Abbruch
{
    class Program
    {
        static void Main(string[] args)
        {
            CancellationTokenSource cts = new CancellationTokenSource();
            CancellationToken abbruchobjekt = cts.Token;

            try
            {
                Task t = Task.Factory.StartNew(() =>
                                                {
                                                    while (true)
                                                    {
                                                        Thread.SpinWait(100000);
                                                        Console.WriteLine("\t Aufgabe wird erledigt");

                                                        if (abbruchobjekt.IsCancellationRequested)
                                                        {
                                                            abbruchobjekt.ThrowIfCancellationRequested();
                                                        }
                                                    }
                                                },
                                                abbruchobjekt
                                              );
                // Ein bisschen warten
                Thread.SpinWait(5000000);

                // Thread abbrechen
                cts.Cancel();

                // Nötig, um Ausnahme abzufangen
                t.Wait();

            }
            catch (AggregateException ae)
            {
                foreach (Exception ie in ae.InnerExceptions)
                {
                    Console.WriteLine(ie.Message);
                }
            }

            Console.ReadLine();
        }
    }
}
