2015-05-04 19 views
6

Tôi đang làm việc trên một ứng dụng mà Khách hàng gặp sự cố sau mỗi vài tháng (họ có thể giải quyết vấn đề bằng cách khởi động lại ứng dụng). Dấu vết ngăn xếp luôn trỏ đến dòng đầu tiên của phương thức ghi đè (lớp kế thừa từ Control) OnPaint() gọi điện đến e.Graphics.Clear().Graphics.Clear() bên trong của OnPaint() thỉnh thoảng gây ra lỗi GDI + chung

Tôi đã đọc về Tài liệu của Microsoft rằng:

Phương pháp rõ ràng xóa trạng thái của đối tượng đồ họa và không nên được gọi khi đối tượng đồ họa không thể được cập nhật. Ví dụ, nếu phương thức Clear được gọi trên một máy tính để bàn an toàn trong một phiên máy chủ đầu cuối, một ExternalException có thể xảy ra, để lại đối tượng Graphics ở trạng thái không nhất quán.

Tôi đã xác minh rằng người dùng ứng dụng không chạy ứng dụng từ máy từ xa. Tôi cũng đã đọc:

Khi ghi đè OnPaint trong lớp dẫn xuất, hãy nhớ gọi phương thức OnPaint của lớp cơ sở để đại biểu đã đăng ký nhận sự kiện.

Thực tế là ứng dụng hiện không gọi lớp cơ sở 'OnPaint() gây ra thông báo lỗi "Lỗi chung chung xảy ra trong GDI +"?

Thật không may là tôi đang đâm vào bóng tối ở vấn đề này bởi vì tôi không thể tái sản xuất và điều này hiếm khi xảy ra trong các tình huống sản xuất. Bất cứ ai có thể cung cấp một số cái nhìn sâu sắc?

+4

Nhiều đối tượng System.Drawing dùng một lần. Không xử lý chúng là một * rất * giám sát chung. Điều đó hoạt động trong một thời gian dài, thường là GC chạy thường xuyên đủ để ngăn chặn sự cố. Cho đến khi nó không, sau đó bạn nhận được ngoại lệ lạ như thế này. Sử dụng Trình quản lý tác vụ, tab Xử lý. Xem + Chọn Cột và đánh dấu Đối tượng GDI. Sửa mã của bạn để con số này ở dưới mức tối đa là vài trăm. –

+0

Bạn có thể thử bắt lỗi –

+0

Tôi có nên gọi 'dispose()' thay vì 'clear()' bên trong phương thức 'OnPaint()' không? – rage

Trả lời

0

Nếu bạn tạo đồ họa, luôn luôn sử dụng nó trong Using statement:

Using gr As Graphics = Graphics.FromImage(image) 

    textSize = gr.MeasureString(myString, myFont) 'sample usage 

End Using 

Mặt khác, không bao giờ Dispose() đối tượng mà bạn không tạo. (Bao gồm các trường hợp của Graphics ...) Khi chúng tôi đơn giản hóa nó, trong trường hợp này, nó đang chờ đợi 'End Using' ở một nơi khác - gần nơi có 'Using'.

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