passando due parametri per un nuovo thread sul ThreadPool a volte può essere complicato, ma sembra che con le espressioni lambda e metodi anonimi, posso fare questo:ThreadPool.QueueUserWorkItem con un'espressione lambda e metodo anonimo
public class TestClass
{
public void DoWork(string s1, string s2)
{
Console.WriteLine(s1);
Console.WriteLine(s2);
}
}
try
{
TestClass test = new TestClass();
string s1 = "Hello";
string s2 = "World";
ThreadPool.QueueUserWorkItem(
o => test.DoWork(s1, s2)
);
}
catch (Exception ex)
{
//exception logic
}
Ora, ho certamente semplificato questo esempio, ma questi punti sono fondamentali:
- Gli oggetti stringa trasmesse, sono immutabili e quindi threadsafe
- Il s1 e s2 variabili sono dichiarate w Nell'ambito del blocco try, che esco subito dopo aver accodato il lavoro al pool di thread, quindi le variabili s1 e s2 non vengono mai modificate successivamente.
C'è qualcosa di sbagliato in questo?
L'alternativa è creare una nuova classe che implementa un tipo immutabile con 3 membri: test, s1 e s2. Sembra solo un lavoro extra senza alcun beneficio a questo punto.
Perché non scrivi semplicemente 'o => test.DoWork (s1, s2)' invece della definizione più dettagliata? –
@ Mehrdad: Perché sono davvero nuovo per le espressioni lambda. ;) - Grazie! –
@ Mehrdad: l'ho modificato nella domanda. –