Is Application.DoEvents() just for WinForms?
Asked Answered
B

4

7

Is Application.DoEvents() just for forms?

I thought that this command was used to ensure that all of the commands before are processed but now after reading the documentation, I'm not sure anymore.

Bauer answered 12/2, 2011 at 11:9 Comment(2)
You really shouldn't ever need to use Application.DoEvents. What problem are you trying to solve? Perhaps someone can suggest a better way of doing so.Inelegant
It’s not just DoEvents. It’s the entire class. That’s why it’s System.Windows.Forms.Application...Diegodiehard
C
16

Yes, it's really aimed at Windows Forms. However, in my view it should be avoided where possible.

It's usually used as a hack by developers who don't want to be bothered with putting long-running operations on a different thread... but that means they're introducing re-entrancy issues which can be very hard to track down, as well as still blocking the UI thread for some of the time (and if that includes something like a file operation, you can't really predict whether the operation will complete quickly enough to not have a user visible effect).

Clark answered 12/2, 2011 at 11:12 Comment(8)
+1000, Not just in your view. There is really no reason to use it at all.Asterisk
DoEvents can be useful for implementing a blocking operation like MessageBox.Suisse
@Vlad: I believe it's better to just disable the rest of the UI input. Otherwise your DoEvents can still mean that the rest of the UI starts to respond when you don't want it to.Clark
@Jon: I basically meant an arbitrary potentially slow function, which has to be blocking (e.g., has to produce an output value). The need for such functions (and not the design with StartCalculation/OnFinish event/callback) is somehow justified by the existence of MessageBox.Show.Suisse
@Vlad: If you have an arbitrary potentially slow function, you simply shouldn't be running it on the UI thread. Run it in a background thread, and update the UI appropriately.Clark
@Jon: I know, I meant exactly that by StartCalculation/OnFinish design. But MessageBox.Show doesn't run in the background thread, so there might be a possibility that someone would need some other functionality modelled on MessageBox.Show. And that in my opinion is where DoEvents can be useful.Suisse
@Jon: looking back from the 1 year's perspective: now I believe that DoEvents is completely evil. :)Suisse
@Vlad: Excellent - glad to hear it )Clark
S
3

Without WinForms, there is no standard event queue. (Well, there is an event queue in WPF, but this is just another framework).

Suisse answered 12/2, 2011 at 11:12 Comment(4)
@Cody: It means that a C# program is not necessarily a WinForms or WPF program. WPF is a framework built on the top of C# (and so is WinForms). The event queues will be available only if you use some of the frameworks, e.g., WinForms or WPF, but not per default.Suisse
Sure. But isn't ASP.NET (for example) also a framework? DoEvents doesn't make much sense there.Inelegant
@Cody: I have no experience with ASP.NET, but I would assume it is. Otherwise event queues would be available in console applications as well.Suisse
@Cody: it's not necessary that a framework brings in the event queue. However, as the event queue is not something built-in into the .NET, the event queue must be introduced by some framework. (Note that the .NET itself is called a framework, making the meaning of this term somewhat ambiguous.)Suisse
A
3

If what you are trying to achieve is waiting for something to happen outside your application (eg. a file to be dropped in a certain directory), a possible workaround would be the Timer class of the System.Timers namespace.

An example (based on 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

More info at MSDN: http://msdn.microsoft.com/en-us/library/system.timers.timer%28v=vs.71%29.aspx

Angry answered 8/11, 2012 at 9:40 Comment(0)
M
2

Yes, it's only for Windows Forms. It wouldn't make sense in a console or ASP.NET application, because there is no message loop. It is possible to do it in WPF, using the dispatcher, as shown here. Anyway, I wouldn't recommend using DoEvents except perhaps in a quick and dirty application, for the reasons explained by Jon.

Millard answered 12/2, 2011 at 11:17 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.