2009-04-28 19 views
6

Arka plan iş parçacığında oldukça titiz hesaplamalar gerçekleştiren bir masaüstü uygulamasına sahibiz. Bu hesaplamanın bölümleri, birlikte çalışma yoluyla eriştiğimiz yönetilmeyen bir kütüphanede gerçekleştirilir. Bulduğumuz şey, hesaplamayı başlattığımızda, UI iş parçacığı hesaplamanın süresi boyunca yanıt vermemesidir. Çerçevenin, UI'nin yanıt vermeye devam etmesine izin vermek için iş parçacığı değiştirme işlemiyle ilgileneceği izlenimi altındaydık, ancak durum böyle değil. UI'nin duyarlı olmasını sağlamak için bir Thread.Sleep (0) veya Application.DoEvents() ekleyebileceğimizi tespit ettik. Bu, hesaplamayı yavaşlatmanın yan etkisine sahiptir. Ayrıca, yönetilmeyen kod tarafından gerçekleştirilen hesaplamanın bölümlerinin tamamlanması 30 saniyeye kadar sürebilir ve bu süre boyunca uygulama her zaman yanıt vermez. Tüm hesaplama, iki ila beş dakika arasında tamamlanabilir..NET Threading Modeli ve Uygulaması.DoEvents vs. Thread.Sleep

Bu şu sorulara yol açar:

  • UI ve birlikte çalışma konusunda .NET framework iş parçacığı modeli nedir?
  • Çerçevenin arka plan ve kullanıcı arabirimi iş parçacıkları arasında iş parçacığı arasında geçiş yapması gerektiğini varsayarak yanlış mıyız?
  • Bu durumda Thread.Sleep ve Application.DoEvents kullanımı arasındaki fark nedir ve diğeri üzerinde tercih edilen nedir?
+0

NOT: Çok eski Q & A; bugün mevcut çözümlerle ilgili iyi yanıtlar almak için yeni tartışmalar araştırın. – ToolmakerSteve

cevap

2

Arka plan iş parçanızın önceliğini azaltabilirsiniz, bu nedenle işletim sistemi tarafından daha fazla engellenir. Önceden tanımlı olduğunda kontrol etmek istediğiniz bazı alan bilginiz varsa, başka bir iş parçacığı varsa, zaman diliminizi teslim eden Thread.Sleep (0) ile devam edebilirsiniz.

Application.DoEvents, windows ileti sırasını pompalar. Bu, uygulamanızın tuş vuruşu veya pencere yeniden boyutlandırma gibi etkinliklere yanıt vermesine neden olur. Thread.Sleep, iş parçacığınızın önlenmesini sağlar (veya Thread.Sleep (0) durumunda).

Ayrıca olsa geri aramalar kullanarak Threading in C#

0

Bunu yapmanın doğru yoldur okuyun. Eşzamansız yöntemleri kullanmanın Silverlight modeline bakın (örneğin, web servis verilerini almak için). Bu sorunun "cevaplandı" olduğunu biliyorum ama cevap ideal IMHO değil.

2

En iyi seçeneğiniz, kendi Thread. DoEvents ve Thread.Sleep(0) hesaplamayı engeller, yavaşlatır. DLL çağrılarınızı ThreadStart temsilcisine veya ParameterizedThreadStart temsilcisine sarabilirsiniz ve Thread'u başlattığınızda temsilci adını parametre olarak kullanabilirsiniz. Oradan, tek yapmanız gereken Thread'un Start yöntemini çağırmak.