Tôi có một máy chủ COM gốc (Delphi) được quảng cáo là STA (Căn hộ Mô hình Threaded).Có bất kỳ lý do nào tại sao việc thiết lập một máy khách .NET được quản lý để sử dụng các luồng STA sẽ gây ra các vấn đề với các ngoại lệ trong một máy chủ COM gốc?
Nó chứa một vài thuật toán ném ngoại lệ tràn trong một số trường hợp. Những trường hợp ngoại lệ được xử lý trong mã, và tất cả mọi thứ hoạt động như nó nên nếu tôi truy cập vào máy chủ COM từ một khách hàng trên các chủ đề chính.
Nếu khách hàng là người bản xứ (Delphi), tôi có thể truy cập máy chủ từ nhiều chủ đề miễn là tôi tuân theo quy tắc mà đối tượng được tạo trên một chuỗi tạo tất cả các cuộc gọi phương thức từ cùng một chuỗi đó. Tuy nhiên nếu khách hàng là một khách hàng được quản lý (Vb.NET và C# thử nghiệm), nếu tôi đặt ApartmentState của các chủ đề khách hàng để MTA, tất cả mọi thứ hoạt động tốt, nhưng tôi nhận được một hit hiệu suất. Điều này tôi mong đợi, như tôi đoán COM phải làm một số pokemon jiggery (tức là marshaling) để đảm bảo mọi người đều hạnh phúc.
Tuy nhiên nếu tôi thay đổi ApartmentState thành STA, và do đó đảm bảo kết nối trực tiếp giữa máy khách và máy chủ, máy khách sẽ gặp lỗi do lỗi, thường là System.stackoverflowexception trong CustomMarshallers.dll.
Nếu tôi loại bỏ các con số gây ra các lỗi tràn này thì tôi không gặp vấn đề gì.
Tôi có thể làm tròn điều này bằng cách tinh chỉnh các thuật toán để không phụ thuộc vào ngoại lệ (có lẽ chúng phải được viết ở nơi đầu tiên), nhưng tôi muốn hiểu lý do đằng sau những gì đang xảy ra.
Mã của bạn phải an toàn trong chuỗi STA. –
Mã là chủ đề an toàn. Tất cả các dữ liệu cá thể là an toàn vì nó được đảm bảo được gọi từ một luồng đơn. Tất cả dữ liệu toàn cầu đã được bảo vệ. – Steve
Không tầm thường nhưng chạy máy chủ COM trong trình gỡ lỗi có thể giúp –