c# - 如何在递归函数内强制事件处理?

标签 c# event-handling

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

最佳答案

那么你可以使用Application.DoEvents - 但我不确定我会建议它。您很容易遇到重入问题,尤其是在 Paint 事件中。

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

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

关于c# - 如何在递归函数内强制事件处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/872231/

相关文章:

c# - 使用 SubscribeOn(Scheduler.TaskPool) 时避免在 Rx 中重叠 OnNext 调用

javascript - 如何使用键盘输入移动三个 JS 立方体?

python - 获取调用事件的按钮名称的最佳方法?

C#知道设置了多少个EventHandlers吗?

c# - Excel 工作簿 - 从 C# 读取速度非常慢?

c# - 比较从字符串转换而来的两个 float

c# - 如何删除 URL 中的占位符

Javascript:代码在加载时调用,但应在发生点击事件时运行

javascript - 在 JavaScript 中将函数指针传递给事件

c# - 如何让 C# Xamarin.Android 应用程序在手机启动时运行?