2012-08-28 36 views
5

Tôi đang làm việc trên một dự án Dot Net, bao gồm một DLL. DLL này sử dụng một .lib (mã C). Thật không may, có nhiều biến tĩnh trong .lib này. Vấn đề tôi có ở đây:DotNet: Biến tĩnh trong DLL

Nếu hai người dùng thực hiện tìm kiếm cùng một lúc, tôi gặp lỗi, vì cả hai đều truy cập vào .lib, một thay đổi trong khi những người khác cố đọc dữ liệu.

Giải pháp hiển nhiên, có thể khóa truy cập, nhưng tôi thực sự không muốn làm điều đó, bởi vì điều đó làm chậm quá trình tìm kiếm giảm đáng kể. Tôi thà cố gắng tạo một DLL từ lib, nhưng tôi không biết liệu điều này có giải quyết được vấn đề hay không, vì tôi không biết liệu các biến tĩnh sẽ được lưu trữ riêng hay nếu cả hai quá trình tìm kiếm sẽ truy cập giống nhau biến.

Có ai có kinh nghiệm với điều này không? Bởi vì nó sẽ mất khá nhiều thời gian để làm điều này, và tôi muốn biết nếu nó hoạt động trước khi tôi bắt đầu làm điều này.

Tôi hy vọng mọi thứ đều dễ hiểu, vì tiếng Anh không phải là ngôn ngữ đầu tiên của tôi và kỹ năng lập trình của tôi khá cơ bản.

+0

Bạn * nên * tránh sử dụng quá mức các trường * tĩnh *. Cố gắng thay đổi thiết kế * Kiểu *. – adatapost

+1

Vấn đề là, mã C có đầy đủ các số liệu thống kê, sẽ mất quá nhiều thời gian để thay đổi mọi thứ. Chỉ thay thế nhanh chóng tôi thấy atm, đang cố gắng này DLL "lừa". – Stefan

+0

@Stefan: xác định loại mới trong một hội đồng mới có quyền truy cập vào mã C đó (và chỉ có nó), nói cách khác là trình bao bọc cho nó. Adn từ whithin loại đó, quản lý truy cập độc quyền vào tài nguyên C theo cách bạn muốn. Vì vậy, nếu bạn muốn gọi một số chức năng C, bạn phải sử dụng loại đó, và nếu bạn sẽ gọi một cái gì đó trong middel thực hiện, cùng loại sẽ chặn bạn, nâng cao một ngoại lệ, hiển thị tin nhắn .. bất cứ điều gì. – Tigran

Trả lời

1

Từ những gì tôi hiểu, không có cách nào bạn sẽ có thể chỉnh sửa simulataniously dữ liệu trong khi bạn đang đọc từ nó bằng cách sử dụng các lớp hiện có trong .dll này. Rõ ràng điều này sẽ không hoạt động, cho dù bạn đang làm gì.

Điều bạn có thể làm là tạo một Thunking Layer. Đây sẽ là một loại lớp trình bao bọc sẽ được gọi thay vì .dll. Lớp này sẽ xử lý các yêu cầu I/O đồng thời bằng cách giữ một bản sao dữ liệu cục bộ để đọc, và cho phép chỉnh sửa các dữ liệu thực, cập nhật bản sao cục bộ khi các thao tác này kết thúc (với khóa tạm thời, vv ..). Có thể có những cách tiêu chuẩn khác để làm điều này mà tôi không biết, nhưng đây là cách tôi sẽ bắt đầu.

Tôi hy vọng điều này sẽ hữu ích.

+0

Ý tưởng sẽ là, rằng mỗi người dùng sẽ có phiên bản riêng của mình của DLL đang chạy. Bây giờ vấn đề là, tôi không biết nếu trong Dot Net, các biến tĩnh sẽ được chia sẻ giữa những người sử dụng, hay không. Nhưng cảm ơn bạn đã liên kết, tôi sẽ nhìn vào nó, nghe có vẻ thú vị! – Stefan

+1

@Stefan biến tĩnh trong '.NET Framework' được chia sẻ giữa tất cả người dùng ứng dụng mà các biến này là một phần của. Nếu bạn sẽ tạo thêm 1 lớp để lộ dữ liệu này, điều đó có thể giúp ích nhưng tôi không chắc chắn về nó. – harry180