We have answer of your question!

100% solved queries, no empty question

Question: How to use an AppDomain to limit a static class' scope for thread-safe use?


0

Advertisement


I have been bitten by a poorly architected solution. It is not thread safe!

I have several shared classes and members in the solution, and during development all was cool...
BizTalk has sunk my battle ship.

We are using a custom BizTalk Adapter to call my assemblies. The Adapter is calling my code and running things in parallel, so I assume it is using multiple threads all under the same AppDomain.

What I would like to do is make my code run under its own AppDomain so the shared problems I have will not muck with each other.

I have a very simple class that the BizTalk adapter is instantiating then running a Process() method.

I would like to create a new AppDomain inside my Process() method, so each time BizTalk spins another thread, it will have its own version of the static classes and methods.

BizTalkAdapter Code:

  // 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);

    }

This is the class BizTalk Calls:

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: The Loader class is in a seperate DLL from the dataFile class.

Any help would be appreciated. I will continue to working on making the code Thread-Safe, but I feel like this could be the "simple" answer.

If anyone has any other thought, please throw in.

Thank you,
Keith

Just for completeness.

I did find that if I marked the send adapter as "Ordered Delivery" in the "Transport Advanced Options" dialog I was able to avoid the multi-thread issues I was having.

I figure this is another possible answer to my problem, but not necessarily to the question.

Question author Keith-sirmons | Source

Answer


1


Advertisement


Using app domains you could do something like this:

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);       
    }
}
Answer author Kev

Advertisement


Tickanswer.com is providing the only single recommended solution of the question How to use an AppDomain to limit a static class' scope for thread-safe use? under the categories i.e c# , thread-safety , biztalk , appdomain , . Our team of experts filter the best solution for you.

You may also add your answer!