Меня укусило плохо спроектированное решение. Это не потокобезопасно!
У меня есть несколько общих классов и членов в решении, и во время разработки все было круто ...
BizTalk потопил мой боевой корабль.
Мы используем пользовательский адаптер BizTalk для вызова моих сборок. Адаптер вызывает мой код и работает параллельно, поэтому я предполагаю, что он использует несколько потоков в одном домене приложений.
Я хотел бы, чтобы мой код работал под собственным доменом приложений, чтобы общие проблемы, которые у меня есть, не мешали друг другу.
У меня есть очень простой класс, который реализует адаптер BizTalk, а затем запускает метод Process ().
Я хотел бы создать новый AppDomain внутри моего метода Process (), поэтому каждый раз, когда 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 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...
}
}
К вашему сведению: класс Loader находится в отдельной DLL от класса dataFile.
Любая помощь будет принята с благодарностью. Я буду продолжать работать над созданием кода Thread-Safe, но я чувствую, что это может быть «простым» ответом.
Если у кого-то есть другие мысли, пожалуйста, добавьте.
Спасибо,
Кит
Только для полноты.
Я обнаружил, что если я пометил отправляющий адаптер как "Заказанная доставка" в
диалоговое окно «Дополнительные параметры транспорта» мне удалось избежать
у меня были проблемы с многопоточностью.
Полагаю, это еще один возможный ответ на мою проблему, но не
обязательно к вопросу.