2012-10-29 20 views
11

Come è possibile eseguire un'attività che restituisce un valore e accetta un parametro? Vedo che c'è un metodo sovraccarico Task.Run<TResult>(Func<TResult>) ma come posso passare un parametro lì?Task.Run e Func <>

risposta

27

Func<TResult> non accetta un parametro. In genere, è acquisire il parametro utilizzando invece un'espressione lambda. Per esempio:

public void DoSomething(string text) 
{ 
    Task<int> task = Task.Run(() => text.Length); 
    ... 
} 

Qui text è un catturato variabile ... quindi anche se si sta solo creando un Func<int>, è usando il parametro del metodo.

+0

Il thread è sicuro? – BVernon

+0

@BVernon: Supponendo che in seguito non si cambi il valore di 'text', mi sembra soddisfacente. –

+0

Penso che mi sto semplicemente dimenticando di alcune cose davvero fondamentali ... se chiamo DoSomething più volte con valori diversi per il testo, allora ci sarà una copia di ogni versione in memoria per ogni chiamata, giusto? – BVernon

6

È possibile utilizzare gli overload di Task.Factory.StartNew() per passare in un oggetto "stato" che contiene tutti i parametri che si desidera utilizzare. Ecco un esempio molto semplice che passa in un NameValueCollection, ma potresti ovviamente passare qualsiasi tipo di oggetto che volevi.

Task<bool>.Factory.StartNew(
    (a) => { 
     NameValueCollection nvc = a as NameValueCollection; 
     if(nvc != null) { 
      nvc.AllKeys.ForEach(k => Console.WriteLine(nvc[k])); 
     } 
     return true; 
    }, 
    new NameValueCollection() { { "param1", "hithere!" } }); 
Problemi correlati