2011-02-12 21 views
7

Formlar için Application.DoEvents() mu?Application.DoEvents() sadece WinForms için mi?

Bu komutun, önceden tüm komutların işlenmesini sağlamak için kullanıldığını ancak şimdi the documentation okunduktan sonra artık emin olmadığımı düşündüm.

+4

Gerçekten hiç 'Application.DoEvents' kullanmak gerekmez. Ne problemi çözmeye çalışıyorsun? Belki de birisi bunu yapmanın daha iyi bir yolunu önerebilir. –

+0

Sadece "DoEvents" değil. Bu tüm sınıf. İşte bu yüzden 'System.Windows.Forms.Application' ... – Timwi

cevap

14

Evet, gerçekten Windows Forms'u hedefliyor. Ancak benim görüşüme göre, mümkün olduğunda kaçınılmalıdır.

Genellikle farklı bir iş parçacığı üzerinde uzun süren operasyonları koymakla uğraşmak istemeyen geliştiriciler tarafından kesmek olarak kullanılır ... ancak bu, çok zor olabilecek yeniden giriş sorunları getirdikleri anlamına gelir. Bazıları için UI iş parçacığını hala engellemenin yanı sıra izler (ve eğer bir dosya işlemi gibi bir şey içeriyorsa, işlemin kullanıcının görünür bir etkisi olmamak için yeterince hızlı tamamlanıp tamamlanmayacağını gerçekten tahmin edemezsiniz).

+1

+1000, Sadece görünümünüzde değil. Bunu kullanmak için hiçbir sebep yok. –

+0

'DoEvents'' MessageBox' gibi bir engelleme işlemi gerçekleştirmek için yararlı olabilir. – Vlad

+0

@Vlad: UI girişinin kalanını devre dışı bırakmanın daha iyi olduğuna inanıyorum. Aksi takdirde, DoEvent'leriniz hala UI'nin geri kalanının istemediğiniz zaman yanıt vermeye başladığı anlamına gelebilir. –

3

WinForms olmadan, standart olay kuyruğu yoktur. (WPF'de bir olay kuyruğu var, ama bu sadece başka bir çerçevedir).

+0

"Bu sadece başka bir çerçeve" ile ne demek istiyorsun? –

+0

@Cody: Bu bir C# programının mutlaka bir WinForms veya WPF programı olmadığı anlamına gelir. WPF, C# üstünde (ve WinForms da olduğu gibi) oluşturulmuş bir çerçevedir.Olay sıraları, yalnızca bazı çerçeveleri, örneğin WinForms veya WPF'yi kullanıyorsanız, ancak varsayılan olarak kullanılamaz. – Vlad

+0

Elbette. Ama ASP.NET değil (örneğin) * ayrıca * bir çerçeve? “DoEvents” orada pek bir anlam ifade etmiyor. –

2

Evet, yalnızca Windows Forms için. Bir ileti döngüsü olmadığı için konsol veya ASP.NET uygulamasında anlamlı olmaz. WPF'de, dağıtıcıyı kullanarak, here'da gösterildiği gibi yapmak mümkündür. Her neyse, Jon tarafından açıklanan nedenlerden dolayı, hızlı ve kirli bir uygulama dışında DoEvents kullanmanızı tavsiye etmem. ne elde etmeye çalıştığınız şey uygulamanın dışında gerçekleşmesi için (örneğin. Belli bir dizinde atılacak bir dosya) bekleyen ise

3

, olası bir geçici çözüm System.Timers ait Zamanlayıcı sınıf olurdu ad alanı.

(MSDN göre) Bir örnek: MSDN at

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 

diğer bilgiler: http://msdn.microsoft.com/en-us/library/system.timers.timer%28v=vs.71%29.aspx

İlgili konular