【发布时间】:2009-01-22 23:38:44
【问题描述】:
是否有任何替代 System.Windows.Forms.Application.DoEvents() 的方法来刷新不使用 System.Windows.Forms 命名空间的事件队列?如果不是,是否可以在 Web 服务中使用上述方法/命名空间。
【问题讨论】:
标签: c# .net vb.net multithreading
是否有任何替代 System.Windows.Forms.Application.DoEvents() 的方法来刷新不使用 System.Windows.Forms 命名空间的事件队列?如果不是,是否可以在 Web 服务中使用上述方法/命名空间。
【问题讨论】:
标签: c# .net vb.net multithreading
Application.DoEvents 用于使表单元素在进程中重绘 这会阻止引发表单绘制事件,因此我不能在 Web 服务中使用。在 Web 服务中,您没有用户界面,没有窗口,也没有消息循环 所以 DoEvents 不会做任何事情。
您认为为什么需要在 Web 服务中使用 Application.DoEvents?
您很可能正在寻找多线程。如果您需要并行执行几件事,则应该使用线程。
编辑查看 cackes 帖子了解更多信息
【讨论】:
正如 Nathan 所指出的,DoEvents 实际上只是循环 Windows 消息泵,导致队列中的顶部消息被翻译和分派。在 Web 服务中,它不太可能做任何事情(除非您使用 IPC 的 Windows 消息或一些古怪的东西)。
如果你有一个线程窃取过多调度程序量子的问题,你可以调用 Thread.Sleep(0) 强制调用线程在下一个调度程序滴答之前让步,这可能会给你其他饥饿的线程更多机会运行,尤其是当它们的优先级相同或更低时。
不过,如果您对这有帮助,那么您很有可能需要重新编写代码以首先防止这种情况发生,而不是尝试通过调度程序产生来修复它。
【讨论】: