// Abbruch.cpp: Hauptprojektdatei.

#include "stdafx.h"

using namespace System;
using namespace System::Threading;
using namespace System::Threading::Tasks;

ref class Aufgabenklasse
{
   CancellationToken abbruchobjekt;

public:
   Aufgabenklasse(CancellationToken ct)
   {
      abbruchobjekt = ct;
   }

   void tueEtwas()
   {
      while (true)
      {
	      Thread::SpinWait(100000);
         Console::WriteLine("\t tueEtwas() tut etwas");

         if (abbruchobjekt.IsCancellationRequested)
         {
            abbruchobjekt.ThrowIfCancellationRequested();
         }
      }
   }
};


int main(array<System::String ^> ^args)
{
    Console::WriteLine(" \n Abbruch von Aufgaben \n");

    // Abbruch-Steuerobjekt erstellen
    CancellationTokenSource^ cts = gcnew CancellationTokenSource();
    CancellationToken abbruchobjekt = cts->Token;

    // Klasse für die Aufgabe erstellen und Abbruch-Steuerobjekt übergeben
    Aufgabenklasse^ aufgabe = gcnew Aufgabenklasse(abbruchobjekt);

    try
    {
         Task^ task = Task::Factory->StartNew(gcnew Action(aufgabe, &Aufgabenklasse::tueEtwas), 
                                              abbruchobjekt);

         // Ein bisschen warten
         Thread::SpinWait(5000000);

         // Thread abbrechen
         cts->Cancel();

         // Nötig, um Ausnahme abzufangen
         task->Wait();
    }
    catch( AggregateException^ ae)
    {
         for each (Exception^ ie in ae->InnerExceptions)
         {
             Console::WriteLine(ie->Message);
         }
    }

    Console::ReadLine();
    return 0;
}
