Πολυνηματική στο Aspose.Slides για .NET
Εισαγωγή
Ενώ η παράλληλη εργασία με παρουσιάσεις είναι εφικτή (εκτός από την ανάλυση/φόρτωση/κλωνοποίηση) και τα πάντα κυλούν καλά (στις περισσότερες περιπτώσεις), υπάρχει μια μικρή πιθανότητα να λάβετε λανθασμένα αποτελέσματα όταν χρησιμοποιείτε τη βιβλιοθήκη σε πολλαπλά νήματα.
Συνιστούμε ιδιαίτερα να μην χρησιμοποιείτε ένα μόνο Presentation αντικείμενο σε περιβάλλον πολυνηματικό, επειδή μπορεί να προκαλέσει απρόβλεπτα σφάλματα ή αποτυχίες που δεν εντοπίζονται εύκολα.
Δεν είναι ασφαλές να φορτώνετε, αποθηκεύετε και/ή να κλωνοποιείτε ένα αντικείμενο της κλάσης Presentation σε πολλαπλά νήματα. Τέτοιες λειτουργίες δεν υποστηρίζονται. Εάν χρειάζεται να εκτελέσετε τέτοιες εργασίες, πρέπει να παραλληλοποιήσετε τις λειτουργίες χρησιμοποιώντας πολλές μονονηματικές διαδικασίες — και κάθε διαδικασία πρέπει να χρησιμοποιεί το δικό της αντικείμενο παρουσίασης.
Μετατροπή διαφανειών παρουσίασης σε εικόνες σε παράλληλο τρόπο
Ας πούμε ότι θέλουμε να μετατρέψουμε όλες τις διαφάνειες από μια παρουσίαση PowerPoint σε εικόνες PNG παράλληλα. Επειδή δεν είναι ασφαλές να χρησιμοποιούμε ένα μόνο αντικείμενο Presentation σε πολλαπλά νήματα, χωρίζουμε τις διαφάνειες της παρουσίασης σε ξεχωριστές παρουσιάσεις και μετατρέπουμε τις διαφάνειες σε εικόνες παράλληλα, χρησιμοποιώντας κάθε παρουσίαση σε ξεχωριστό νήμα. Το παρακάτω παράδειγμα κώδικα δείχνει πώς γίνεται αυτό.
var inputFilePath = "sample.pptx";
var outputFilePathTemplate = "slide_{0}.png";
var imageScale = 2;
using var presentation = new Presentation(inputFilePath);
var slideCount = presentation.Slides.Count;
var slideSize = presentation.SlideSize.Size;
var conversionTasks = new List<Task>(slideCount);
for (var slideIndex = 0; slideIndex < slideCount; slideIndex++)
{
// Εξάγετε τη διαφάνεια i σε ξεχωριστή παρουσίαση.
var slidePresentation = new Presentation();
slidePresentation.SlideSize.SetSize(slideSize.Width, slideSize.Height, SlideSizeScaleType.DoNotScale);
slidePresentation.Slides.RemoveAt(0);
slidePresentation.Slides.AddClone(presentation.Slides[slideIndex]);
// Μετατρέψτε τη διαφάνεια σε εικόνα σε ξεχωριστή εργασία.
var slideNumber = slideIndex + 1;
conversionTasks.Add(Task.Run(() =>
{
try
{
var slide = slidePresentation.Slides[0];
using var image = slide.GetImage(imageScale, imageScale);
var imageFilePath = string.Format(outputFilePathTemplate, slideNumber);
image.Save(imageFilePath, ImageFormat.Png);
}
finally
{
slidePresentation.Dispose();
}
}));
}
await Task.WhenAll(conversionTasks);
Συχνές ερωτήσεις
Χρειάζεται να καλώ τη ρύθμιση άδειας σε κάθε νήμα;
Όχι. Αρκεί να το κάνετε μία φορά ανά διεργασία/τομέα εφαρμογής πριν ξεκινήσουν τα νήματα. Εάν η ρύθμιση άδειας μπορεί να κληθεί συγκρότως (π.χ., κατά την αργή αρχικοποίηση), συγχρονίστε την κλήση επειδή η μέθοδος ρύθμισης άδειας δεν είναι thread‑safe.
Μπορώ να μεταφέρω αντικείμενα Presentation ή Slide μεταξύ νημάτων;
Η μεταφορά «ζωντανών» αντικειμένων παρουσίασης μεταξύ νημάτων δεν συνιστάται: χρησιμοποιήστε ανεξάρτητα αντικείμενα ανά νήμα ή προδημιουργήστε ξεχωριστές παρουσιάσεις/containers διαφανειών για κάθε νήμα. Αυτή η προσέγγιση ακολουθεί τη γενική σύσταση να μην μοιράζεστε ένα ενιαίο αντικείμενο παρουσίασης μεταξύ νημάτων.
Είναι ασφαλές να παραλληλοποιήσουμε την εξαγωγή σε διαφορετικές μορφές (PDF, HTML, εικόνες) εφόσον κάθε νήμα έχει το δικό του αντικείμενο Presentation;
Ναι. Με ανεξάρτητα αντικείμενα και ξεχωριστές διαδρομές εξόδου, τέτοιες εργασίες συνήθως παραλληλοποιούνται σωστά· αποφύγετε οποιαδήποτε κοινά αντικείμενα παρουσίασης και κοινά ρεύματα I/O.
Τι πρέπει να κάνω με τις παγκόσμιες ρυθμίσεις γραμματοσειρών (φακέλους, υποκαταστάσεις) σε πολυνηματικό περιβάλλον;
Αρχικοποιήστε όλες τις παγκόσμιες ρυθμίσεις γραμματοσειρών πριν ξεκινήσετε τα νήματα και μην τις αλλάξετε κατά τη διάρκεια της παράλληλης εργασίας. Αυτό εξαλείφει τους ανταγωνισμούς κατά την πρόσβαση σε κοινόχρηστους πόρους γραμματοσειρών.