Sobes.tech
Middle

Πώς μπορείτε να ακυρώσετε την εκτέλεση μιας εργασίας (task) σε C#;

sobes.tech AI

Απάντηση από AI

Για την ακύρωση της εκτέλεσης μιας εργασίας σε C#, χρησιμοποιείται ο μηχανισμός CancellationToken και CancellationTokenSource.

  1. Δημιουργείται ένα CancellationTokenSource.
  2. Λαμβάνεται ένα CancellationToken από το CancellationTokenSource.
  3. Το CancellationToken περνάει σε μια μέθοδο που εκτελεί την εργασία.
  4. Μέσα στη τρέχουσα μέθοδο, ελέγχεται περιοδικά η ιδιότητα IsCancellationRequested του token.
  5. Αν το IsCancellationRequested είναι true, παράγεται μια OperationCanceledException ή εφαρμόζεται άλλη λογική τερματισμού.
  6. Για να ζητηθεί η ακύρωση, καλείται η μέθοδος Cancel() στο αντικείμενο CancellationTokenSource.

Παράδειγμα χρήσης:

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

// Δημιουργία πηγής tokens ακύρωσης
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;

// Δημιουργία εργασίας
Task task = Task.Run(() =>
{
    try
    {
        for (int i = 0; i < 100; i++)
        {
            // Έλεγχος αν έχει ζητηθεί ακύρωση
            if (token.IsCancellationRequested)
            {
                // Παράγει μια OperationCanceledException
                token.ThrowIfCancellationRequested();
            }

            // Προσομοίωση εργασίας
            Console.WriteLine($"Εργάζομαι... {i}");
            Thread.Sleep(100);
        }
    }
    catch (OperationCanceledException)
    {
        // Διαχείριση της εξαίρεσης ακύρωσης
        Console.WriteLine("Η εργασία ακυρώθηκε.");
    }
    catch (Exception ex)
    {
        // Διαχείριση άλλων εξαιρέσεων
        Console.WriteLine($"Παρουσιάστηκε σφάλμα: {ex.Message}");
    }
}, token); // Μεταβίβαση του token στην εργασία

// Περιμένουμε λίγο και στη συνέχεια ζητάμε ακύρωση
Thread.Sleep(500);
Console.WriteLine("Ζητάω ακύρωση...");
cts.Cancel();

// Περιμένουμε να ολοκληρωθεί η εργασία
try
{
    task.Wait();
}
catch (AggregateException ae)
{
    // Διαχείριση εξαιρέσεων, συμπεριλαμβανομένης της OperationCanceledException
    foreach (var e in ae.InnerExceptions)
    {
        if (e is OperationCanceledException)
        {
            Console.WriteLine("Η εργασία ακυρώθηκε (μέσω Wait)." );
        }
        else
        {
            // Διαχείριση άλλων εξαιρέσεων
            Console.WriteLine($"Σφάλμα κατά το κλείσιμο της εργασίας: {e.Message}");
        }
    }
}

Console.WriteLine("Το κύριο πρόγραμμα ολοκληρώθηκε.");

Εναλλακτικές:

  • Επιστροφή ειδικής τιμής ή σημαίας από την εργασία.
  • Έλεγχος μιας σημαίας που έχει οριστεί εξωτερικά, χωρίς τη χρήση CancellationToken.

Ωστόσο, το CancellationToken είναι η τυπική και συστηνόμενη προσέγγιση λόγω της ενσωμάτωσής του με τη βιβλιοθήκη Task Parallel Library (TPL), τις ασύγχρονες λειτουργίες και την υποστήριξη για OperationCanceledException.