【问题标题】:Is Application.DoEvents() just for WinForms?Application.DoEvents() 是否仅适用于 WinForms?
【发布时间】:2011-02-12 11:09:10
【问题描述】:

Application.DoEvents() 仅用于表单吗?

我以为这个命令是用来确保之前的所有命令都被处理,但现在看了the documentation之后,我不确定了。

【问题讨论】:

  • 你真的不应该使用Application.DoEvents。你想解决什么问题?也许有人可以提出更好的方法。
  • 不仅仅是DoEvents。这是整个班级。这就是为什么它是System.Windows.Forms.Application...

标签: c# .net winforms doevents


【解决方案1】:

是的,它确实针对 Windows 窗体。但是,在我看来,应该尽可能避免。

它通常被那些不想为将长时间运行的操作放在不同线程上而烦恼的开发人员用作一种技巧……但这意味着他们引入了很难跟踪的重入问题关闭,并且在某些时候仍然阻塞 UI 线程(如果这包括文件操作之类的东西,您无法真正预测该操作是否会以足够快的速度完成而不会产生用户可见的效果)。

【讨论】:

  • +1000,不只是在你看来。完全没有理由使用它。
  • DoEvents 可用于实现像 MessageBox 这样的阻塞操作。
  • @Vlad:我认为最好禁用其余的 UI 输入。否则,您的 DoEvents 仍然可能意味着 UI 的其余部分在您不希望时开始响应。
  • @Jon:我的意思是一个任意的可能很慢的函数,它必须是阻塞的(例如,必须产生一个输出值)。 MessageBox.Show 的存在以某种方式证明了对此类函数的需求(而不是带有 StartCalculation/OnFinish 事件/回调的设计)。
  • @Jon:从 1 年的角度回顾:现在我相信 DoEvents 完全是邪恶的。 :)
【解决方案2】:

没有 WinForms,就没有标准的事件队列。 (嗯,WPF 中有一个事件队列,但这只是另一个框架。

【讨论】:

  • @Cody:这意味着C#程序不一定是WinForms或WPF程序。 WPF 是建立在 C# 之上的框架(WinForms 也是如此)。仅当您使用某些框架(例如 WinForms 或 WPF)时,事件队列才可用,但默认情况下不可用。
  • 当然。但是ASP.NET(例如)不是一个框架吗? DoEvents 在那里没有多大意义。
  • @Cody:我没有使用 ASP.NET 的经验,但我认为是。否则事件队列也将在控制台应用程序中可用。
  • @Cody:框架没有必要引入事件队列。但是,由于事件队列不是 .NET 内置的,因此必须由某些框架引入事件队列。 (请注意,.NET 本身 被称为框架,这使得该术语的含义有些模糊。)
【解决方案3】:

如果您尝试实现的是等待应用程序外部发生某些事情(例如,将文件拖放到某个目录中),则可能的解决方法是使用 TimerSystem.Timers 命名空间。

一个例子(基于 MSDN):

Private Sub SetTimer()
    Dim aTimer As New System.Timers.Timer
    AddHandler aTimer.Elapsed, AddressOf OnTimedEvent
    aTimer.Interval = 5000
    aTimer.Enabled = True

    Console.WriteLine("Press q to exit")
    While Console.Read <> Asc("q")
    End While
End Sub

Private Sub OnTimedEvent(ByVal source As Object, ByVal e As ElapsedEventArgs)
    'Do the job here
    Console.WriteLine("HELLO WORLD!")
    'Don't forget to disable the timer if you don't need it anymore
    'Source.Enabled = False
End Sub

MSDN 上的更多信息:http://msdn.microsoft.com/en-us/library/system.timers.timer%28v=vs.71%29.aspx

【讨论】:

    【解决方案4】:

    是的,它仅适用于 Windows 窗体。这在控制台或 ASP.NET 应用程序中没有意义,因为没有消息循环。可以使用调度程序在 WPF 中执行此操作,如 here 所示。无论如何,我不建议使用DoEvents,除非可能是在一个快速而肮脏的应用程序中,原因由 Jon 解释。

    【讨论】:

      猜你喜欢
      • 2021-12-16
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 2011-05-18
      • 2016-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多