การทำงานหลายเธรดใน 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 ร่วม

ควรทำอย่างไรกับการตั้งค่าฟอนต์ระดับโลก (โฟลเดอร์, การทดแทน) ในการทำงานหลายเธรด?

ให้กำหนดค่าฟอนต์ระดับโลกทั้งหมดก่อนเริ่มเธรดและไม่เปลี่ยนแปลงระหว่างการทำงานขนาน วิธีนี้จะขจัดปัญหาการแข่งขันเมื่อเข้าถึงทรัพยากรฟอนต์ที่ใช้ร่วมกัน