2012-10-29 12 views
11

मैं एक कार्य कैसे चला सकता हूं जो मूल्य लौटाता है और पैरामीटर लेता है? मैं देखता हूं कि एक अधिभारित विधि Task.Run<TResult>(Func<TResult>) है लेकिन मैं वहां पैरामीटर कैसे पारित कर सकता हूं?कार्य.रुन और Func <>

उत्तर

27

Func<TResult> पैरामीटर नहीं लेता है। आम तौर पर आप कैप्चर करते हैं, इसके बजाय लैम्ब्डा अभिव्यक्ति का उपयोग करते हुए पैरामीटर। उदाहरण के लिए:

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

यहाँ text एक पर कब्जा कर लिया चर है ... तो भी आप सिर्फ एक Func<int> बना रहे हैं, हालांकि, यह विधि पैरामीटर का उपयोग कर है।

+0

क्या यह धागा सुरक्षित है? – BVernon

+0

@BVernon: मान लीजिए कि आप बाद में 'टेक्स्ट' के मान को नहीं बदलते हैं, यह मेरे लिए ठीक लग रहा है। –

+0

मुझे लगता है कि मैं कुछ सचमुच मूलभूत सामानों को भूल रहा हूं ... यदि मैं टेक्स्ट के लिए अलग-अलग मानों के साथ कई बार कई बार कॉल करता हूं तो प्रत्येक कॉल के लिए स्मृति में प्रत्येक संस्करण की एक प्रति होगी, है ना? – BVernon

6

आप "राज्य" ऑब्जेक्ट में पास करने के लिए Task.Factory.StartNew() ओवरलोड का उपयोग कर सकते हैं जिसमें आपके द्वारा उपयोग किए जाने वाले सभी पैरामीटर हैं। NameValueCollection में गुजरने वाला एक बहुत ही मूल उदाहरण है, लेकिन आप स्पष्ट रूप से किसी भी प्रकार की ऑब्जेक्ट में गुजर सकते हैं।

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!" } }); 
संबंधित मुद्दे