การทำงานหลายเธรดใน Aspose.Slides สำหรับ .NET
บทนำ
แม้ว่าการทำงานแบบขนานกับการนำเสนอจะเป็นไปได้ (นอกเหนือจากการแยกวิเคราะห์/โหลด/สำเนา) และส่วนใหญ่จะทำงานได้อย่างราบรื่น (ส่วนใหญ่), ก็มีโอกาสเล็กน้อยที่คุณอาจได้รับผลลัพธ์ที่ไม่ถูกต้องเมื่อใช้ไลบรารีในหลายเธรด
เราขอแนะนำอย่างยิ่งว่า ไม่ ควรใช้ตัวอย่าง การนำเสนอ เพียงหนึ่งตัวในสภาพแวดล้อมที่ใช้หลายเธรด เพราะอาจทำให้เกิดข้อผิดพลาดหรือความล้มเหลวที่ไม่สามารถคาดการณ์ได้และตรวจจับยาก
ไม่ปลอดภัยที่จะโหลด, บันทึก, และ/หรือสำเนาตัวอย่างของคลาส การนำเสนอ ในหลายเธรด การดำเนินการดังกล่าว ไม่ ได้รับการสนับสนุน หากคุณต้องการทำงานเหล่านี้ คุณต้องทำงานแบบขนานโดยใช้หลายกระบวนการแบบ single‑threaded และแต่ละกระบวนการควรใช้ตัวอย่างการนำเสนอของตนเอง
แปลงสไลด์การนำเสนอเป็นภาพแบบขนาน
สมมติว่าเราต้องการแปลงสไลด์ทั้งหมดจากการนำเสนอ 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);
คำถามที่พบบ่อย
ฉันต้องเรียกการตั้งค่าลิขสิทธิ์ในทุกเธรดหรือไม่?
ไม่จำเป็น เพียงทำครั้งเดียวต่อกระบวนการ/โดเมนแอปก่อนที่เธรดจะเริ่มทำงาน หาก การตั้งค่าลิขสิทธิ์ อาจถูกเรียกพร้อมกัน (เช่น ระหว่างการเริ่มต้นแบบ lazy) ให้ทำการซิงโครไนซ์การเรียกนั้น เนื่องจากเมธอดการตั้งค่าลิขสิทธิ์เองไม่ปลอดภัยต่อเธรด
ฉันสามารถส่งผ่านวัตถุ Presentation หรือ Slide ระหว่างเธรดได้หรือไม่?
การส่งผ่านวัตถุการนำเสนอที่ยังใช้งานอยู่ระหว่างเธรดไม่แนะนำ: ให้ใช้ตัวอย่างอิสระต่อเธรดหรือสร้างการนำเสนอ/คอนเทนเนอร์สไลด์แยกล่วงหน้าสำหรับแต่ละเธรด วิธีนี้สอดคล้องกับคำแนะนำทั่วไปที่ไม่ควรแชร์ตัวอย่างการนำเสนอเดียวกันระหว่างเธรด
การทำส่งออกเป็นรูปแบบต่าง ๆ (PDF, HTML, ภาพ) แบบขนานปลอดภัยหรือไม่ หากแต่ละเธรดมี Presentation ของตนเอง?
ใช่ เมื่อใช้ตัวอย่างแยกกันและเส้นทางเอาต์พุตแยกกัน งานเหล่านี้มักทำงานแบบขนานได้อย่างถูกต้อง; ควรหลีกเลี่ยงการแชร์วัตถุกาานนำเสนอและสตรีม I/O ร่วม
ควรทำอย่างไรกับการตั้งค่าฟอนต์ระดับโลก (โฟลเดอร์, การทดแทน) ในการทำงานหลายเธรด?
ให้กำหนดค่าฟอนต์ระดับโลกทั้งหมดก่อนเริ่มเธรดและไม่เปลี่ยนแปลงระหว่างการทำงานขนาน วิธีนี้จะขจัดปัญหาการแข่งขันเมื่อเข้าถึงทรัพยากรฟอนต์ที่ใช้ร่วมกัน