2010-10-29 26 views
5

Giả sử tôi phải hiển thị một số đồ họa trên một số điều khiển. Nhưng sẽ có ba hình ảnh được chuyển đổi dựa trên một số điều kiện. Ba bitmap được thêm vào tệp tài nguyên.Nhận ảnh bằng ResourceManager GetObject - Gọi nó mọi lúc hoặc lưu trữ kết quả?

Vì vậy, tôi truy xuất chúng bằng cách gọi ResourceManager.GetObject.

Câu hỏi đặt ra là, nó phải là:

  1. Mỗi lần tôi phải chuyển sang hình ảnh, tôi gọi GetObject để có được nó và gán cho sự kiểm soát hoặc
  2. giữ kết quả của GetObject cho mỗi hình ảnh ngay từ đầu, do đó sẽ chỉ có 3 cuộc gọi đến GetObject. Chỉ định hình ảnh từ các biến của tôi thay thế.

Làm 1) dường như tạo ra nhiều Xử lý GC khi được xem bằng CLR Profiler. Hy vọng biết bất kỳ tác dụng phụ xấu nào của 2).

Cảm ơn rất nhiều.

Trả lời

5

Mỗi cuộc gọi đến GetObject sẽ đọc hình ảnh từ hội đồng và tải nó vào đối tượng Bitmap.

Gọi điện thoại nhiều lần sẽ tạo ra chi phí đáng kể; bạn nên lưu trữ hình ảnh.

1

MSDN documentation tuyên bố rằng giá trị của tài nguyên được trả về bởi ResourceManager.GetObject. Vì có vẻ như các bitmap riêng lẻ không thay đổi ở thời gian chạy, nên chỉ có phần bên dưới tôi nhìn thấy tiếp cận # 2 là dấu chân bộ nhớ của bạn sẽ lớn hơn một chút.

3

Chỉ cần một điều khác để chỉ ra về việc gọi "ResourceManager.GetObject" mỗi lần bạn cần sử dụng hình ảnh từ Tài nguyên có vẻ như tạo một Windows Handle mới mỗi lần. Trong trường hợp của bạn có lẽ không phải là một vấn đề lớn nhưng nếu bạn đã giữ chúng trong một thời gian như chúng tôi đã làm nó có thể gây ra một vấn đề.

Chúng tôi đã có một DataGridView rằng chúng tôi đã đẩy hình ảnh từ Tài nguyên vào các trường khác nhau của lưới và khi lưới đó chiếm trên 3000 hàng, chúng tôi đã vượt quá mức tối đa cho phép của Windows cho chương trình 32 bit.

Lỗi xuất hiện một ngoại lệ đối số ngẫu nhiên với thông báo "Tham số không hợp lệ". Chúng tôi đã có một vài giờ suy nghĩ chúng tôi đã có một rò rỉ bộ nhớ nhưng cuối cùng đã tìm thấy những gì chúng tôi tải GUI này với lưới mà các ứng dụng xử lý đã đi từ 700-1000 đến hơn 10K trước khi nó ngay cả tải xong và sẽ sụp đổ toàn bộ chương trình và không thể phục hồi. Vì vậy, tôi khuyên bạn nên chọn tùy chọn 2 ở đây.

2

Tôi cũng đã triển khai "read once then store in variable" concept trong các lớp học của mình.

Để đưa ra một ví dụ, đây là một đoạn trích từ mã của tôi:

internal static class MyResourcesHolder 
{ 
    private static Image _i1; 
    private static Image _i2; 
    private static Image _i3; 
    private static Image _i4; 
    private static Image _i5; 

    public static Image MyImage01 => _i1 ?? (_i1 = Resources.MyImage01); 
    public static Image MyImage02 => _i2 ?? (_i2 = Resources.MyImage02); 
    public static Image MyImage03 => _i3 ?? (_i3 = Resources.MyImage03); 
    public static Image MyImage04 => _i4 ?? (_i4 = Resources.MyImage04); 
    public static Image MyImage05 => _i5 ?? (_i5 = Resources.MyImage05); 
} 

Có lẽ đây sẽ giúp người một ngày nào đó.

Các vấn đề liên quan