如何在递归函数内部强制事件处理?

时间:2009-05-16 11:27:37

标签: c# event-handling

我正在用C#编写一个屏幕保护程序,慢慢绘制Sierpinski三角形。我在递归函数中使用Thread.Sleep来减慢绘图速度。但是我需要一种允许用户通过移动鼠标,按键等退出的方法。当我从窗体的Paint事件处理程序内部调用绘图函数时,鼠标和键盘事件仅在处理后绘制整个三角形,这可能需要一段时间。在递归函数运行时,如何强制表单处理事件? (以及如何避免因调用绘制函数而导致的无限循环,该事件调用绘制函数,强制事件处理调用绘制事件等。)

2 个答案:

答案 0 :(得分:4)

可以使用Application.DoEvents - 但我不确定我会建议它。您可以轻松地解决重新入侵问题,尤其是在Paint事件中。

如果您正在处理Paint事件,听起来真的需要在UI线程上完成所有真正的工作 - 是吗?

另一种方法是创建一个Bitmap并绘制到它上面,而不是使用Paint事件处理程序。您可以在后台线程上执行此操作,定期创建新图像,将到目前为止绘制的图像复制到其上,绘制下一层(或其他),然后编组到UI线程以使用UI中的图像。这将保持主UI线程可用于事件处理。您根本不需要处理Paint事件 - 只需使用PictureBox来显示“到目前为止的图像”。当你完成它们时,不要忘记丢弃旧的位图,以避免内存问题。

答案 1 :(得分:2)

你可以使用你想要计算/绘制的后备缓冲区位图,只需在Paint事件中显示它。计算可以在一个单独的线程中完成。