2009-05-08 27 views
10

Aşağıdaki iki kod parçası arasındaki fark nedir? İkincisini kullanırken herhangi bir sorun olacak mı?Threading ve lambda ifadeleri

Senaryo 1: Senaryo 2'de 2

private void Log(Exception e) 
{ 
    ThreadPool.QueueUserWorkItem(
     (obj) => 
      { 
       Logger.Log(e); 
      }); 
} 

, ben ThreadPool'da bir Paramtre olarak istisna geçirerek değilim

private void Log(Exception e) 
{ 
    ThreadPool.QueueUserWorkItem(new WaitCallback(Log), e); 
} 

private void Log(object obj) 
{ 
    Exception e = (Exception)obj; 
    Logger.Log(e); 
} 

Senaryo. Özel durum nesnesinin iş parçacığı sıralaması nasıl oluşur? Herhangi bir sorun olacak mı? Bunu yapmanın sınırlamaları nelerdir? Büyük avantaj, herhangi bir sayıda parametreyi çok kolay bir şekilde geçirebilmenizdir.

cevap

14

tek fark, iki senaryoda etkili bunu kaybetmemeniz için yığın taşınır özel türü içine yığın değişken e hamle e değişkenin üzerinde kapanış olmasıdır.

Bunun iyi çalışması gerektiğini düşünüyorum.

Düzeltme: Performans açısından, iki senaryo arasında önemli bir fark olmamalıdır. Senaryo 1'de, istisna başvurusunu yığın üzerinde dahili olarak hareket ettiren istisnasını QueueUserWorkItem yöntemine iletiyorsunuz. Tek ek yük, bir kapatma kullandığınızda derleyicinin sizin için bir tür oluşturması ve yakalanan değişkenlerin bu türdeki alanlar olarak depolanmasıdır.

+0

var mı? –

+0

İyi cevap. Gerçekten de, lambda ifadesi bir kapanış oluşturur (http://en.wikipedia.org/wiki/Closure_(computer_science)) böylece değişken (genel durumda birden fazla olabilir) başka bir yerde referans alınabilir. – Noldorin

+0

@anon: Hayır, bildiğim kadarıyla herhangi bir performans çıkarımı olmamalı. – Noldorin

1

Onun yerine Lambda, anonim bir yöntemle aynı yapabilirdi, nota ve aynı zamanda C# 2.0 çalışacak: herhangi bir performans etkileri

ThreadPool.QueueUserWorkItem(delegate(Object e) 
    { 
     Logger.Log(e as Exception); 
    }); 
+0

+1 Yazdıklarınız, derleyicinin OP'nin sorusu içindeki lambda ifadesi için tam olarak ürettiği şeydir. –

+0

Evet, ancak OP daha fazla parametre içeriyorsa, anonim yöntem işe yaradı mı? –

İlgili konular