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.
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.
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).
+1000, Sadece görünümünüzde değil. Bunu kullanmak için hiçbir sebep yok. –
'DoEvents'' MessageBox' gibi bir engelleme işlemi gerçekleştirmek için yararlı olabilir. – Vlad
@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. –
WinForms olmadan, standart olay kuyruğu yoktur. (WPF'de bir olay kuyruğu var, ama bu sadece başka bir çerçevedir).
"Bu sadece başka bir çerçeve" ile ne demek istiyorsun? –
@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
Elbette. Ama ASP.NET değil (örneğin) * ayrıca * bir çerçeve? “DoEvents” orada pek bir anlam ifade etmiyor. –
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
, 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
Gerçekten hiç 'Application.DoEvents' kullanmak gerekmez. Ne problemi çözmeye çalışıyorsun? Belki de birisi bunu yapmanın daha iyi bir yolunu önerebilir. –
Sadece "DoEvents" değil. Bu tüm sınıf. İşte bu yüzden 'System.Windows.Forms.Application' ... – Timwi