كيفية استخدام AppDomain للحد من فئة "نطاق ثابت للاستخدام موضوع آمن؟

StackOverflow https://stackoverflow.com/questions/307292

سؤال

ولقد للعض من حل سوء هندستها. وليس من خيط آمن!

ولدي عدة فئات وأفراد المشتركة في الحل، وأثناء التطور كان كل شيء بارد ...
وقد غرقت BizTalk سفينتي المعركة.

ونحن نستخدم المحول BizTalk مخصصة لدعوة المجالس بلدي. محول تدعو قانون بلدي ويعمل أشياء في موازاة ذلك، لذلك أفترض أنه يستخدم مواضيع متعددة وكلها تحت نفس AppDomain.

ما أود القيام به هو جعل قانون بلدي تعمل تحت AppDomain خاصة بها حتى المشاكل المشتركة ولدي لن الوحل مع بعضها البعض.

ولدي فئة بسيطة جدا أن محول BizTalk وinstantiating ثم تشغيل طريقة عملية ().

وأود أن إنشاء AppDomain جديد داخل بلدي طريقة عملية ()، لذلك في كل مرة BizTalk يدور موضوع آخر، وسوف يكون نسختها الخاصة من الفئات وأساليب ثابتة.

ورمز BizTalkAdapter:

  // this is inside the BizTalkAdapter and it is calling the Loader class //
  private void SendMessage(IBaseMessage message, TransactionalTransmitProperties properties)
    {

        Stream strm = message.BodyPart.GetOriginalDataStream();
        string connectionString = properties.ConnectionString;
        string msgFileName = message.Context.Read("ReceivedFileName", "http://schemas.microsoft.com/BizTalk/2003/file-properties") as string;


        Loader loader = new Loader(strm, msgFileName, connectionString);
        loader.Process();

        EventLog.WriteEntry("Loader", "Successfully processed: " + msgFileName);

    }

وهذا هو يدعو الطبقة BizTalk:

public class Loader
{

    private string connectionString;
    private string fileName;
    private Stream stream;
    private DataFile dataFile;

    public Loader(Stream stream, string fileName, string connectionString)
    {
        this.connectionString = connectionString;
        this.fileName = fileName;
        this.stream = stream;
    }  

    public void Process()
    {

        //*****  Create AppDomain HERE *****
        // run following code entirely under that domain
        dataFile = new DataFile(aredStream, fileName, connectionString);
        dataFile.ParseFile();
        dataFile.Save();
        // get rid of the AppDomain here...

    }

}

وFYI: فئة محمل هي في DLL منفصلة من الطبقة datafile Cesar: سيزار

.

وسيكون موضع تقدير أي مساعدة. سأستمر في العمل على جعل رمز الموضوع والآمن، لكنني أشعر أن هذا يمكن أن يكون "بسيطة" الجواب.

وإذا كان أي شخص لديه أي فكرة أخرى، من فضلك رمي في.

وشكرا لكم،
كيث

<اقتباس فقرة>   

وفقط للتأكد من اكتمالها.

     

ولم أجد أنني إذا وضعت المحول إرسال باسم "تسليم أمر" في   وكان الحوار "خيارات متقدمة النقل" كنت قادرا على تجنب   قضايا متعددة الصفحات I كان لها.

     

وأنا أحسب هذا هو الجواب أخرى ممكنة لمشكلتي، ولكن ليس   بالضرورة إلى هذه المسألة.

هل كانت مفيدة؟

المحلول

وعن طريق مجالات التطبيق الذي يمكن أن تفعل شيئا من هذا القبيل:

public class Loader
{

    private string connectionString;
    private string fileName;
    private Stream stream;
    private DataFile dataFile;

    public Loader(Stream stream, string fileName, string connectionString)
    {
        this.connectionString = connectionString;
        this.fileName = fileName;
        this.stream = stream;
    }  

    public void Process()
    {
        //*****  Create AppDomain HERE *****
        string threadID = Thread.CurrentThread.ManagedThreadId.ToString();
        AppDomain appDomain = AppDomain.CreateDomain(threadID);

        DataFile dataFile = 
            (DataFile) appDomain.CreateInstanceAndUnwrap(
                        "<DataFile AssemblyName>", 
                        "DataFile", 
                        true, 
                        BindingFlags.Default,
                        null,
                        new object[] 
                        { 
                            aredstream, 
                            filename, 
                            connectionString 
                        },
                        null,
                        null,
                        null);
        dataFile.ParseFile();
        dataFile.Save();

        appDomain.Unload(threadID);       
    }
}

نصائح أخرى

ما الشيء، بالضبط، هو كونه الألم من حيث السلامة موضوع؟ لا أستطيع أن أرى أي سنغلتونس حالة ثابتة ولا - ويبدو أن هناك مناسبة الأشياء "الجديدة" ... أنا كونه أعمى

فما هي أعراض كنت ترى ...

وإجابة AppDomain سيكون (نسبيا) بطيئة. كجزء من نظام المدعومة الوسيطة وهذا قد يكون موافق (بمعنى "نسبيا" في نفس الكرة الحديقة).

إذا <م> قيام لدي بعض حالة ثابتة في مكان ما، هناك خيار آخر أن يعمل في بعض الأحيان [ThreadStatic] - الذي يفسر وقت التشغيل بأنها "هذا المجال ثابت هي فريدة من نوعها في موضوع". عليك أن تكون حذرا مع التهيئة، على الرغم - المنشئ ثابت على موضوع وقد تعيين حقل، ولكن بعد ذلك الخيط B ستشهد اغية / 0 / الخ

لماذا لا مجرد وضع قفل حول رمز الذي تريد تنفيذه بالتسلسل؟ سيكون من عنق الزجاجة، ولكن ينبغي لها أن تعمل في بيئة مؤشرات.

public class Loader
{
    private static object SyncRoot = new object();
    private string connectionString;
    private string fileName;
    private Stream stream;
    private DataFile dataFile;

    public Loader(Stream stream, string fileName, string connectionString)
    {
        this.connectionString = connectionString;
        this.fileName = fileName;
        this.stream = stream;
    }  

    public void Process()
    {

        lock(SyncRoot) {
            dataFile = new DataFile(aredStream, fileName, connectionString);
            dataFile.ParseFile();
           dataFile.Save();
        }

    }

}

إذا قمت بمشاركته احصائيات التي تتعارض مع بعضها البعض، فإنك قد ترغب في محاولة مضيفا [ThreadStatic] سمة لهم. وهذا سيجعل لهم المحلي إلى كل موضوع. وهذا قد يحل المشكلة على المدى القصير. ومن شأن الحل الصحيح يكون لمجرد rearchitect الاشياء الخاصة بك لتكون ذات ألوان.

وفقط للتأكد من اكتمالها.

ولم أجد أنني إذا وضعت المحول إرسال باسم "تسليم أمر" في "خيارات متقدمة النقل" الحوار وكنت قادرا على تجنب القضايا متعدد الخيط الأول هو وجود.

وأنا أحسب هذا هو الجواب أخرى ممكنة لمشكلتي، ولكن ليس بالضرورة على السؤال.

وإنشاء وهدم وappdomain عن كل مكالمة - أنا أعتبر أنك لست قلقا حول أداء على هذا واحد

ومن الناحية المثالية يجب تغيير كود دعا إلى أن يكون threadsafe.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top