Qual è la differenza tra i due pezzi di codice qui sotto? Ci saranno problemi nell'usare il secondo?Threading e espressioni lambda
Scenario 1:
private void Log(Exception e)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(Log), e);
}
private void Log(object obj)
{
Exception e = (Exception)obj;
Logger.Log(e);
}
Scenario 2
private void Log(Exception e)
{
ThreadPool.QueueUserWorkItem(
(obj) =>
{
Logger.Log(e);
});
}
Nello scenario 2, io non sto passando l'eccezione in un Parametro al ThreadPool. Come si verifica il thread marshalling dell'oggetto di eccezione? Ci saranno problemi? Quali sono i limiti di fare questo se del caso? Il grande vantaggio è che puoi passare facilmente qualsiasi numero di parametri.
Ci sono delle implicazioni sulle prestazioni? –
Buona risposta. In effetti, l'espressione lambda genera una chiusura (http://en.wikipedia.org/wiki/Closure_(computer_science)) in modo che la variabile (che può essere più di una nel caso generale) possa essere referenziata altrove. – Noldorin
@anon: No, non ci dovrebbero essere implicazioni di prestazioni per quanto ne so. – Noldorin