Tôi đã bị cắn bởi một giải pháp kiến trúc kém. Nó không phải là chủ đề an toàn!Làm thế nào để sử dụng một AppDomain để giới hạn phạm vi của một lớp tĩnh để sử dụng thread-safe?
Tôi có một số lớp học và thành viên được chia sẻ trong giải pháp, và trong quá trình phát triển tất cả đều ...
BizTalk đã đánh chìm tàu chiến của tôi.
Chúng tôi đang sử dụng Bộ điều hợp BizTalk tùy chỉnh để gọi cho hội đồng của tôi. Bộ điều hợp đang gọi mã của tôi và chạy mọi thứ song song, vì vậy tôi cho rằng nó đang sử dụng nhiều luồng tất cả trong cùng một AppDomain.
Điều tôi muốn làm là làm cho mã của tôi chạy dưới AppDomain riêng của nó để các vấn đề được chia sẻ mà tôi có sẽ không muck với nhau.
Tôi có một lớp rất đơn giản mà bộ điều hợp BizTalk là instantiating sau đó chạy một phương thức Process().
Tôi muốn tạo một AppDomain mới bên trong phương thức Process() của tôi, vì vậy mỗi khi BizTalk quay một luồng khác, nó sẽ có phiên bản riêng của các lớp và phương thức tĩnh.
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);
}
Đây là lớp BizTalk cuộc gọ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 *****
// run following code entirely under that domain
dataFile = new DataFile(aredStream, fileName, connectionString);
dataFile.ParseFile();
dataFile.Save();
// get rid of the AppDomain here...
}
}
FYI: Lớp Loader là trong một DLL riêng biệt từ lớp datafile.
Mọi trợ giúp sẽ được đánh giá cao. Tôi sẽ tiếp tục làm việc để tạo mã Thread-Safe, nhưng tôi cảm thấy như thế này có thể là câu trả lời "đơn giản".
Nếu ai có bất kỳ suy nghĩ khác, vui lòng ném vào.
Cảm ơn bạn,
Keith
Chỉ cần cho đầy đủ.
Tôi nhận thấy rằng nếu tôi đánh dấu bộ chuyển đổi gửi là "Giao hàng đặt hàng" trong hộp thoại "Tùy chọn nâng cao giao thông", tôi có thể tránh các sự cố nhiều chủ đề mà tôi đang gặp phải.
Tôi cho rằng đây là một câu trả lời có thể khác cho vấn đề của tôi, nhưng không nhất thiết phải trả lời câu hỏi.
Vì vậy, bạn không nói về các lớp và đối tượng tĩnh, bạn đang nói về một cá thể đơn lẻ, đúng không? –