.NET Web Service - วิธีเรียก C dll ที่ไม่มีการจัดการ

ฉันมีข้อกำหนดในการเรียก dll (c ที่ไม่มีการจัดการ) จากบริการเว็บ .NET (asmx หรือ WCF)

การเรียก dll จากบริการบนเว็บนั้นตรงไปตรงมาและทำงานได้ตามที่คาดไว้

อย่างไรก็ตาม ปัญหาเกิดขึ้นเมื่อฉันโหลดทดสอบบริการเว็บ (รหัสข้อผิดพลาด 0xC0000374 - "ข้อผิดพลาดภายใน โดยทั่วไปเกี่ยวข้องกับความเสียหายของฮีป")

ฉันได้รับแจ้งจากเจ้าของ dll ว่า dll นั้นไม่น่าเชื่อถือในสภาพแวดล้อมแบบมัลติเธรด หากมีการโทร 2 สายขึ้นไปในเวลาเดียวกัน

ในแอป windows แบบดั้งเดิม ฉันจะจัดการกับสิ่งนี้โดยการใช้คลาสซิงเกิลตันเพื่อปกป้อง dll มีแนวทางที่แนะนำเพื่อให้บรรลุสิ่งนี้ในการใช้งานบริการเว็บหรือไม่?


person JohnC    schedule 09.06.2010    source แหล่งที่มา
comment
โปรดพยายามแบ่งปันรายละเอียด มากที่สุดเท่าที่ เป็นไปได้ ปัญหาเกิดขึ้น - ปัญหาประเภทใด?   -  person Andrey    schedule 09.06.2010
comment
ฉันไม่เห็นว่ารูปแบบซิงเกิลตันป้องกันการโทรแบบขนานที่มาจากเธรดต่างๆ ได้อย่างไร   -  person Darin Dimitrov    schedule 09.06.2010
comment
Andrey คำถามอัปเดตพร้อมข้อมูลเพิ่มเติม   -  person JohnC    schedule 09.06.2010
comment
โปรดอธิบายว่าคุณเรียก dll จาก .NET web service asmx ได้อย่างไร ฉันต้องบรรลุเป้าหมายเดียวกัน แต่ดูเหมือนว่าฉันไม่สามารถโหลด dll ได้   -  person Anass Boukalane    schedule 17.12.2016
comment
@JohnC คุณช่วยกรุณาให้ตัวอย่างการเรียก dll จากบริการบนเว็บได้ไหม   -  person Anass Boukalane    schedule 19.12.2016


คำตอบ (2)


หากคุณต้องการให้แน่ใจว่ามีเพียงเธรดเดียวในแต่ละครั้งที่สามารถเรียก dll ของคุณได้ คุณสามารถรวมการเข้าถึงใดๆ ไว้ในคำสั่ง lock ได้:

public static class MyDllCalls
{
    private static object _lockObject = new object();

    public static int SomeCall()
    {
        lock (_lockObject)
        {
            return CallSomeFunctionInYourDll();
        }
    }
}

มีเพียงเธรดเดียวเท่านั้นที่สามารถล็อคไว้ได้ในเวลาที่กำหนด ดังนั้นวิธีนี้คุณสามารถป้องกันไม่ให้หลายเธรดทำการโทรพร้อมกันได้

person Fredrik Mörk    schedule 09.06.2010

เพื่อป้องกันไม่ให้หลายเธรดเรียกวิธีการเดียวกันแบบขนานคุณสามารถใช้ กลไกการล็อค

person Darin Dimitrov    schedule 09.06.2010