C# WndProc处理程序效率低下

C# WndProc处理程序效率低下,c#,.net,winforms,C#,.net,Winforms,我的表格中有以下WndProc处理程序。应防止水平移动模板(仅允许垂直移动): 它可以工作,但当用户移动表单时,CPU使用率会显著增加。这个函数中有什么效率这么低?有什么方法可以解决这个问题吗?如果不在if块中调用base.WndProc,您可以直接吞掉消息 if (!ShowCaption && m.Msg == 0x216) { // Trap WM_MOVING } else { base.WndProc(ref m); } 另一种解决方案(效果很好,但有

我的表格中有以下WndProc处理程序。应防止水平移动模板(仅允许垂直移动):


它可以工作,但当用户移动表单时,CPU使用率会显著增加。这个函数中有什么效率这么低?有什么方法可以解决这个问题吗?

如果不在if块中调用base.WndProc,您可以直接吞掉消息

if (!ShowCaption && m.Msg == 0x216)
{
    // Trap WM_MOVING
}
else
{
    base.WndProc(ref m);
}
另一种解决方案(效果很好,但有时会闪烁)


我试过你的代码,效果很好。正如您所说,它并没有达到100%的CPU饱和,只占用了约16%

我想需要很长时间来处理的是表单的绘制,或者是后台窗口的绘制(而不是wndproc实现)

尝试通过添加等待来限制表单每秒可以进行的重绘量

System.Threading.Thread.Sleep(10);
在这一行之后:

Marshal.StructureToPtr(rc, m.LParam, false);
拖动时睡眠10毫秒会限制窗体每秒重绘100次以上,同时会留下一些未使用的CPU


编辑:忘了提到添加睡眠将我的盒子上的~16%更改为~12%。

Hm。。。看起来它没有帮助高CPU使用率并不一定是一件坏事。这实际上是一个问题,或者为什么要查看CPU使用率?这确实是一个问题:它会导致其他进程挂起此站点需要分配。我认为Marshal.*效率不高,因此每秒多次调用它(在您的情况下发生)可能会导致CPU使用高峰。@Mattias:如果您正在做CPU密集型的事情,CPU使用率高并不是一件坏事。大多数应用程序不是这样,因此大多数应用程序不应该占用CPU。
System.Threading.Thread.Sleep(10);
Marshal.StructureToPtr(rc, m.LParam, false);