2009-10-08 4 views
7

Zaman uyumsuz bir işlem (bir dizi ağ IO'ları) üzerinde bir zaman aşımı uygularım ve hangisinin 'daha iyi' (tahsisatlardan/performanstan) bir perspektif olduğundan emin değilim: EventWaitHandle ve RegisterWaitForSingleObject kullanarak veya sadece bir Timer oluşturma ve Tick kullanarak..Net Zaman Aşımları: WaitForSingleObject ve Zamanlayıcı

Benim özel durumumda EventWaitHandle tembel oluşturuldu, ancak açıkçası WaitForSingleObject kullanmak için başlatılması gerekir. Yani gerçekten bu bir WaitHandle + WaitForSingleObject vs bir Timer kaynak maliyeti hakkında bir sorudur. Her iki yaklaşım da uygulanması kolay.

Her ikisini de çeşitli zamanlarda uyguladım, bu yüzden araziyi anlıyorum, hangi yaklaşımın 'daha iyi' olduğundan emin değilim.

cevap

3
Microsoft'un Morgan Skinner seems to prefer RegisterWaitForSingleObject.

Bildiğim kadarıyla tahsisleri ile ilgili olarak, reflektör bir zamanlayıcı dahili TimerBase yanı sıra _TimerCallback adında bir sınıf oluşturur iken RegisterWaitForSingleObject, bir RegisteredWaitHandle bir örneğini oluşturmak ortaya koymaktadır. Biri bu sınıfların ve benzerlerinin büyüklüklerini karşılaştırabilir ve karşılaştırabilir, ancak daha fazla bağımlılığa, özellikle de yönetilmeyen olanlara (her ikisi de win32 işlevlerinin altında yatan) sahip olabilirler - bu yüzden ben gerçekten doğru bir cevap veremiyorum.

Bekleme işlemi için RegisterWaitForSingleObject'a iletilmiş olsa da, tek bir Maunal/AutoResetEvent ayırabileceğinizi ve tüm çağrılara aktarabileceğinizi unutmayın (zaman aşımına güveniyor olduğunuzdan, bunu bir daha işaretlemezsiniz). .

Performans devam ettikçe, ben de emin değilim. ThreadPool, RegisterWaitForSingleObject aracılığıyla kaydedilen her 63 eylem için özel bir bekleme ipi kullanacaktır. Aksine, bir zamanlayıcı temelde bir win32 zamanlayıcı kullanacaktır. Her ikisi de gerçek yürütme için bir ThreadPool çalışan iş parçacığı kullanarak sona erecek. Hangi senaryolarda hangisi daha iyidir? beni aşar .. o yüzden bu sefer Skinner'la giderdik :)

Ayrıca bakınız: Katılmıyorum

+0

Onun blog makalenin a Kullanımların iyi bir karşılaştırması, ancak diğerine karşı lehine çok güçlü bir öneri yoktur. Ve bunu düşündüğümde, çekirdek geçişleri ve benzerleri açısından bir fark göremedim. Altta yatan Win32 API'sinde herhangi bir maliyet farkı olup olmadığını bilmek isterdim, ancak .net uygulamasının 'weight' değeri de bulduğum en iyi cevap gibi görünüyor. – piers7

1

Hiçbiri daha iyi değil. Bir zamanlayıcı, iş parçacığını periyodik olarak bir şeyler yapmak için "kandırmak" için kullanılır. WaitForSingleObject kolları üzerinde bekler. Zaman aşımı var, böylece kilitlenme halinde takılmak yerine beklemeyi durdurmak için kullanabilirsiniz. Zaman aşımını kullanırsanız, waitforsingleobject'i kilitlemek için bir zamanlayıcı kullanmak gerekmez.

Kaynak maliyeti, her ikisi için de önemsizdir. Hangi yaklaşımı kullanacağınızı söyleyemem çünkü sahip olduğunuz kod durumuna çok bağlı.

+2

. Bu basit bir soru: bir bekçinin ve bir WaitForSingleObject tahsis maliyetinin bir zamanlayıcı tahsis maliyeti. Onlar hem OS kaynakları. Durumumdan bağımsız olarak biri diğerinden daha pahalı olmalı. Ve bu senaryoda ben, zamanlayıcı bir 'kapalı biri' hakkında * * periyodik kod 'poke' için kullanılabilecek hem konuşuyorum iken - RegisterWaitForSingleObject üzerinde 'executeOnlyOnce' bayrağını kullanabilirsiniz ... – piers7