我被一个架构不佳的解决方案所困扰。它不是线程安全的!
我在解决方案中有几个共享的类和成员,在开发过程中一切都很酷......
BizTalk 击沉了我的战舰。
我们正在使用自定义 BizTalk 适配器来调用我的程序集。适配器正在调用我的代码并并行运行,所以我假设它在同一个 AppDomain 下使用多个线程。
我想做的是让我的代码在它自己的 AppDomain 下运行,这样我遇到的共享问题就不会相互混淆。
我有一个非常简单的类,BizTalk 适配器正在实例化然后运行 Process() 方法。
我想在我的 Process() 方法中创建一个新的 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...
}
}
仅供参考:Loader 类与 dataFile 类位于单独的 DLL 中。
任何帮助,将不胜感激。我将继续致力于使代码线程安全,但我觉得这可能是“简单”的答案。
如果有人有其他想法,请提出。
谢谢你,
基思
只是为了完整性。
我确实发现,如果我在“传输高级选项”对话框中将发送适配器标记为“有序交付”,我就能够避免我遇到的多线程问题。
我认为这是我的问题的另一个可能答案,但不一定是这个问题。