Middle
Πώς μπορείτε να ακυρώσετε την εκτέλεση μιας εργασίας (task) σε C#;
sobes.tech AI
Απάντηση από AI
Για την ακύρωση της εκτέλεσης μιας εργασίας σε C#, χρησιμοποιείται ο μηχανισμός CancellationToken και CancellationTokenSource.
- Δημιουργείται ένα
CancellationTokenSource. - Λαμβάνεται ένα
CancellationTokenαπό τοCancellationTokenSource. - Το
CancellationTokenπερνάει σε μια μέθοδο που εκτελεί την εργασία. - Μέσα στη τρέχουσα μέθοδο, ελέγχεται περιοδικά η ιδιότητα
IsCancellationRequestedτου token. - Αν το
IsCancellationRequestedείναιtrue, παράγεται μιαOperationCanceledExceptionή εφαρμόζεται άλλη λογική τερματισμού. - Για να ζητηθεί η ακύρωση, καλείται η μέθοδος
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.