System.ComponentModel.Win32Exception: The operation completed successfully

前端 未结 8 1454
無奈伤痛
無奈伤痛 2020-12-04 22:20

I am getting this exception sometimes while running my Windows Forms app for a long time:

System.ComponentModel.Win32Exception: The operation completed succe         


        
8条回答
  •  离开以前
    2020-12-04 22:43

    Just to sum it up, the custom grid I wrote, that is based on the .Net's DataGridView, uses custom code to draw cells. Rows in my grid can span multiple visual pages. (That was a business requirement)

    The problem was that .Net pre-allocates a buffer of memory for controls with DoubleBuffering enabled. For DataGridViews grids the buffer needs to be rather large to accommodate possible large rows in the grid. In extreme cases a row can span up to 32000 pixels (because of a .net limitation). Grid widths in the project are usually between 500 and 800 pixels. So the resulting buffer can be (32bpp * 800 * 32000 = ~100MB)

    So in short, the system could not create compatible graphics objects, because occasionally, it could not reserve a buffer large enough to fit the required data.

    To fix it I had to introduce a series of optimizations:

    • limited max row height allowed in my custom grid to 1500 pixels
    • updated buffer re-allocation code to only execute when the new buffer size is greater than the existing
    • ensured that the buffers are not reallocated with every data binding, and preallocated to a sensible size.
    • reviewed all code and made sure that unmanaged resources are properly disposed when not in use, as recommended here: http://nomagichere.blogspot.com/2008/03/systemcomponentmodelwin32exception-is.html

提交回复
热议问题