【问题标题】:DoEvents in .NET.NET 中的 DoEvents
【发布时间】:2015-11-03 15:41:52
【问题描述】:

什么是 .NET 中 VB6 的 DoEvents 的等价物?

编辑:

我有一个 Sub 需要很长时间才能完成工作。 (它有一个do-while)当我调用它时,表格变成白色。在 VB6 中,我曾经在方法中(在其 do-while 内)放置一个 DoEvents 以防止这种情况发生。

【问题讨论】:

  • 同时考虑 BackgroundWorker 而不是 DoEvents。 DoEvents (有充分的理由)被认为是一种不好的做法。
  • 我不同意这被认为是不好的做法 - 在错误的情况下是不好的,我当然会认为它是代码异味,但有合法用途。

标签: .net vb.net


【解决方案1】:

在少数情况下(如果有的话)DoEvents 是 .NET 中的正确解决方案。如果您发布一些关于您正在做的事情,我们可能会提供一些替代方案的建议。


为响应您的编辑,您需要创建一个BackgroundWorker。这将使您的主(GUI)线程保持空闲,允许它重新绘制并正常运行。网上有很多这方面的教程,包括this one

【讨论】:

  • +1。我同意;每当我看到或听到 .NET 代码中的 DoEvents 时,我都会看到一个警告标志,表明存在需要注意的设计问题。
  • 我见过很多使用 DoEvents 的游戏循环。在那种情况下,这似乎不是一个完全坏主意。
【解决方案2】:

Application.DoEvents() 应该是您要查找的内容。

但是,请注意以下事项(来自链接的 MSDN 页面):

与 Visual Basic 6.0 不同,DoEvents 方法不调用 Thread.Sleep 方法。

更新

鉴于现在的问题提供了对用法的解释,我会说重构以使用后台线程将是一个更好的解决方案。 DoEvents 可能会导致一些问题,因为它会导致底层消息队列泵送,这可能导致重新进入和许多其他副作用。 DoEvents 有有效的用例,我不敢说它的使用是不好的做法——它的存在是有正当理由的——但在大多数情况下,有比仅仅调用 DoEvents 更好的解决方案。

【讨论】:

  • 如果使用不当并且不了解正在发生的事情,它只会是邪恶的。不知道 Windows 如何发送消息不是借口,而仅仅为了避免学习而产生新线程同样糟糕。
【解决方案3】:

其他答案是正确的,作为旁注如果您需要使用 DoEvents() 考虑使用 BackgroundWorker 或 Control.Invoke 。 99% 的时间 DoEvents() 表示一些肮脏的黑客行为。

【讨论】:

    【解决方案4】:

    最简单的方法是:

    Application.DoEvents()

    因此您可以拨打DoEvents

    【讨论】:

      【解决方案5】:

      对于那些认为 DoEvents 是邪恶的人,请改用它:

      System.Windows.Forms.Application.ThreadContext.FromCurrent.RunMessageLoop(2, Nothing)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-18
        • 2013-04-11
        • 2010-12-16
        • 2023-03-07
        • 1970-01-01
        • 2011-04-24
        • 2015-01-25
        相关资源
        最近更新 更多