Multitrådning i Aspose.Slides för .NET
Introduktion
Medan parallellt arbete med presentationer är möjligt (förutom parsning/inläsning/kloning) och allt går bra (mesteparten av gångerna), finns det en liten risk att du får felaktiga resultat när du använder biblioteket i flera trådar.
Vi rekommenderar starkt att du inte använder en enda Presentation instans i en flertrådad miljö eftersom det kan leda till oförutsägbara fel eller misslyckanden som inte är lätta att upptäcka.
Det är inte säkert att ladda, spara och/eller klona en instans av en Presentation klass i flera trådar. Sådana operationer inte stöds. Om du behöver utföra sådana uppgifter måste du parallellisera operationerna med flera enkeltrådade processer — och varje process ska använda sin egen presentationsinstans.
Konvertera presentationsbilder till bilder parallellt
Låt oss säga att vi vill konvertera alla bilder från en PowerPoint-presentation till PNG‑bilder parallellt. Eftersom det är osäkert att använda en enda Presentation‑instans i flera trådar, delar vi upp presentationsbilderna i separata presentationer och konverterar bilderna till bilder parallellt, genom att använda varje presentation i en separat tråd. Följande kodexempel visar hur man gör detta.
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++)
{
// Extrahera bild i till en separat presentation.
var slidePresentation = new Presentation();
slidePresentation.SlideSize.SetSize(slideSize.Width, slideSize.Height, SlideSizeScaleType.DoNotScale);
slidePresentation.Slides.RemoveAt(0);
slidePresentation.Slides.AddClone(presentation.Slides[slideIndex]);
// Konvertera sliden till en bild i en separat uppgift.
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);
Vanliga frågor
Behöver jag anropa licensinställning i varje tråd?
Nej. Det räcker att göra det en gång per process/app‑domän innan trådarna startar. Om license setup kan anropas parallellt (till exempel vid lat initiering), synkronisera det anropet eftersom licensinställningsmetoden i sig inte är trådsäker.
Kan jag skicka Presentation‑ eller Slide‑objekt mellan trådar?
Att skicka “live”‑presentationsobjekt mellan trådar rekommenderas inte: använd oberoende instanser per tråd eller för‑skapa separata presentationer/slide‑behållare för varje tråd. Detta tillvägagångssätt följer den allmänna rekommendationen att inte dela en enda presentationsinstans över trådar.
Är det säkert att parallellisera export till olika format (PDF, HTML, bilder) förutsatt att varje tråd har sin egen Presentation‑instans?
Ja. Med oberoende instanser och separata utdata‑sökvägar parallelliseras sådana uppgifter vanligtvis korrekt; undvik delade presentationsobjekt och delade I/O‑strömmar.
Vad bör jag göra med globala teckensnittinställningar (mappar, ersättningar) i flerkörning?
Initiera alla globala teckensnittinställningar innan trådarna startas och ändra dem inte under parallellt arbete. Detta eliminerar race‑förhållanden vid åtkomst till delade teckensnittresurser.