2013-07-02 3 views
19

अभी अभी मैं कतारबद्ध धागे जोड़ने के लिए निम्नलिखित कोड का उपयोग कर रहा हूं। मुझे यह पसंद नहीं है। और मेरे सहयोगी या तो नहीं होंगे क्योंकि वे सी # बहुत अच्छी तरह से नहीं जानते हैं। मैं चाहता हूं कि एक नए धागे में निष्पादित करने के लिए एक विधि को कतारबद्ध करना है।सी # - थ्रेडपूल QueueUserWorkItem उपयोग करें?

private static void doStuff(string parameter) 
{ 
    // does stuff 
} 

// call (a) 
ThreadPool.QueueUserWorkItem(a => doStuff("hello world")); 
// call (b) 
ThreadPool.QueueUserWorkItem(delegate { doStuff("hello world"); }); 

तो वहाँ ThreadPool.QueueUserWorkItem के अन्य उपयोग बदलाव होते रहते हैं?

सर्वश्रेष्ठ 1-लाइन-कॉल होगा। यदि संभव हो तो Func<> या Action<> के उपयोग के साथ।


संपादित करें: उत्तर और टिप्पणियों से प्राप्त (बी) और मुझे यह पहले से बेहतर पसंद है।

+2

आपके परिदृश्य में ThreadPool.QueueUserWorkItem() के साथ क्या गलत है? –

+1

आप "प्रतिनिधि" कीवर्ड का उपयोग कर सकते हैं। कुछ ऐसा है, ThreadPool.QueueUserWorkItem (प्रतिनिधि {doStuff ("");})। जैसा कि उपर्युक्त विधि के समान है, लेकिन जैसा कि आप चाहते हैं, यह करने का यह एक और तरीका है .. –

+1

दुनिया में क्यों आपको लगता है कि प्रतिनिधि वाक्यविन्यास लैम्बडास से क्लीनर है !? –

उत्तर

12

आपके प्रश्न का उत्तर इस बात पर निर्भर करता है कि आप एप्लिकेशन को कैसे डिज़ाइन करते हैं। क्या आप इसे एक आम परियोजना के अंदर रखते हैं? आप एक साधारण परिचालन को ऊपर नहीं लेना चाहते हैं।

लेकिन, आप थ्रेडपूल QueueUserItem के लिए एक सामान्य कॉल बना सकते हैं जो पैरा, 1 param, 2 param, आदि प्राप्त करता है .. यह एक साधारण स्ट्रिंग भेजने और प्रतिबंधित होने के बजाय अच्छा है।

इस तरह आप WaitCallback के साथ एक पैरामीटर Impl QueueUserItem:

ThreadPool.QueueUserWorkItem(
    new WaitCallback(delegate(object state) 
    { YourMethod(Param1, Param2, Param3); }), null); 

से C# Execute Method (with Parameters) with ThreadPool

लिया और विचारों के लिए कुछ लिंक:
http://msdn.microsoft.com/en-us/library/4yd16hza.aspx
Generic ThreadPool in .NET
Difference between delegate.BeginInvoke and using ThreadPool threads in C#

+0

क्या यह 'Func' या' action' या अतिरिक्त कॉल बॉडी के बिना भी संभव होगा? – Bitterblue

+0

यह संभव होगा, जब आप WaitCallback बनाते हैं, तो एक साधारण "प्रतिनिधि" न भेजें, इसके बजाय अपना स्वयं का प्रतिनिधि भेजें। * लेकिन *, आप परिणाम वापस पाने की उम्मीद कैसे करते हैं? आमतौर पर जब कार्यकर्ता धागे को ऑपरेशन भेजते हैं, तो आप नतीजे सुनिश्चित करने के लिए न केवल परिणाम प्राप्त करने की उम्मीद करते हैं। आप एसिंक पैटर्न को लागू करके इसे प्राप्त कर सकते हैं। http://www.c-sharpcorner.com/UploadFile/rmcochran/multithreadasyncwebservice05262007094719AM/multithreadasyncwebservice.aspx – ilansch

13

मैं पूरी तरह यकीन है कि वाक्य रचना की किस तरह आप देख रहे हैं नहीं कर रहा हूँ, लेकिन आप अपने उदाहरण में अप्रयुक्त a, बजाय क्यों Task का उपयोग नहीं पसंद नहीं है तो क्या होगा?

Task.Run(() => doStuff("hello world")); 

यह वास्तव में एक बहुत बेहतर नहीं लगता है, लेकिन कम से कम यह एक अप्रयुक्त पहचानकर्ता नहीं है।

नोट: Task.Run() नेट 4.5 या बाद में है। आप नेट 4 उपयोग कर रहे हैं आप क्या करना है:

Task.Factory.StartNew(() => doStuff("hello world")); 

जो के रूप में कम नहीं है।

उपर्युक्त दोनों थ्रेड पूल का उपयोग करते हैं।

तुम सच में एक लैम्ब्डा का उपयोग कर से बचना चाहिए, तो आप एक अनाम प्रतिनिधि (जो पहले ही उल्लेख किया @nowhewhomustnotbenamed) का उपयोग कर सकते हैं:

Task.Run(delegate { doStuff("Hello, World!"); }); 

लेकिन उस की बात क्या है? यह बहुत कम पठनीय है!

+0

वास्तव में मैं लैम्ब्डा चीज़ से बचना चाहता हूं। – Bitterblue

+0

@ मिनी-वे वैसे मैंने एक उदाहरण जोड़ा जो लैम्ब्डा का उपयोग करने से बचाता है ... यह बदतर है, आईएमओ। –

+9

@ मिनी-मुझे लैम्ब्डा अभिव्यक्तियों ने काफी समय पहले अज्ञात प्रतिनिधियों को प्रतिस्थापित किया। तो आप बाद में इसके बजाय जल्द ही उपयोग करने के लिए अच्छा होगा। – nashwan

2
इस बारे में

क्या ?

class Program 
{ 
    static void Main(string[] args) 
    { 
     ThreadPool.QueueUserWorkItem(MyWork, "text"); 
     Console.ReadKey(); 
    } 

    private static void MyWork(object argument) 
    { 
     Console.WriteLine("Argument: " + argument); 
    } 
} 

या आप हस्ताक्षर प्रतिबंधित हो नहीं करना चाहती है और आप इसे this.For तरीकों कि क्या करना है और कोई मान नहीं है और 6 के लिए है की तरह कर सकते हैं एक धागे पर तरीकों डालने की एक सरल तरीका है, तो पैरामीटर के लिए आपको 12 ओवरलोड को परिभाषित करने की आवश्यकता होगी यदि मुझे गलत नहीं है।इसे आगे थोड़ा और काम करने की आवश्यकता है, लेकिन उपयोग करने के लिए और अधिक आसान है।

class Program 
{ 
    static void Main(string[] args) 
    { 
     var myClass = new MyClass(); 
     myClass.DoWork(); 
     Console.ReadKey(); 
    } 
} 

public static class ObjectThreadExtension 
{ 
    public static void OnThread(this object @object, Action action) 
    { 
     ThreadPool.QueueUserWorkItem(state => 
     { 
      action(); 
     }); 
    } 

    public static void OnThread<T>(this object @object, Action<T> action, T argument) 
    { 
     ThreadPool.QueueUserWorkItem(state => 
     { 
      action(argument); 
     }); 
    } 
} 

public class MyClass 
{ 
    private void MyMethod() 
    { 
     Console.WriteLine("I could have been put on a thread if you like."); 
    } 

    private void MySecondMethod(string argument) 
    { 
     Console.WriteLine(argument); 
    } 

    public void DoWork() 
    { 
     this.OnThread(MyMethod); 
     this.OnThread(MySecondMethod, "My argument"); 
    } 
} 
+0

यह मेरे लिए एक विजेता होगा, अगर यह हस्ताक्षर प्रतिबंधित नहीं था। लेकिन अभी भी इसे एक विधि देने के लिए थोड़े शांत और इसके साथ किया जाना चाहिए। – Bitterblue

+0

@ बिटरब्लू मैंने एक दूसरा दृष्टिकोण जोड़ा है। थोड़ा और आगे काम करते हैं, लेकिन मेरी राय में उपयोग में सबसे आसान है। –

संबंधित मुद्दे