Đóng một C # / C ++ DLLImport hoặc ít nhất là phân bổ bộ nhớ heap của nó? [đóng cửa]

Jan 15 2021

Tôi có một ứng dụng C # .NET Framework gọi một C ++ DLL không được quản lý thông qua DLLImport, để phân tích cú pháp một loạt các tệp do người dùng cung cấp và thực hiện một số thao tác.

Tôi muốn có một thanh tiến trình trên ứng dụng C # của mình, vì quá trình phân tích cú pháp tệp này có thể là một quá trình lâu dài. Cách tốt nhất tôi đã nghĩ để làm điều này là phân tích cú pháp một vài tệp cùng một lúc, sau đó quay lại mã C # để tôi có thể cập nhật thanh tiến trình.

Tuy nhiên, điều này yêu cầu tôi phân bổ một số bộ nhớ trên heap của C ++ DLL để tôi không phải chuyển tất cả hơn 10.000 đường dẫn tệp làm đối số mỗi khi tôi phải gọi lại hàm C ++.

Tôi không chắc liệu có thể đóng DLL sau khi tôi hoàn tất quá trình phân tích cú pháp hay không. Có cách nào khác để tôi có thể hoàn thành tác vụ này mà không phải giữ tất cả các đường dẫn trong bộ nhớ được cấp phát trong toàn bộ thời gian ứng dụng đang chạy không?

Trả lời

3 RomanPolunin Jan 15 2021 at 05:35

Vì bạn đã xác nhận rằng các tệp là độc lập, bạn nên thử song song hoạt động.

Về phía nhà sản xuất của quy trình, hãy thiết lập một Danh sách hoặc một mảng có tên tệp. Nếu danh sách quá lớn (thực sự, THỰC SỰ lớn nên nó gây căng thẳng cho RAM khả dụng), bạn có thể muốn thay thế nó bằng sự kết hợp của BlockingCollection và Queue, do đó, trình sản xuất có thể được điều chỉnh cho đến khi số lượng mục trong ống xử lý dưới ngưỡng .

Ở phía bên kia của đường ống này, hãy bắt đầu một worker (nội tuyến hoặc dưới dạng luồng worker riêng biệt) sẽ tuần tự hoặc .AsParallel () đọc các mục từ bộ sưu tập và chuyển chúng đến thư viện không được quản lý để xử lý.

Vì đây là một ứng dụng giao diện người dùng, tôi đoán luồng công nhân của bạn nên riêng biệt. Trên mỗi tệp được xử lý, hãy thực hiện .Invoke () trên biểu mẫu giao diện người dùng để cập nhật thanh tiến trình.