2011-03-01 10 views
16

अगर मैं एकC# धागा विधि

public void Method(int m) 
{ 
    ... 
} 

कैसे मैं इस विधि के लिए एक धागा बना सकते हैं है?

Thread t = new Thread((Method));

t.Start(m);

काम नहीं कर रहा है।

+1

वास्तव में क्या हो रहा है? क्या काम नहीं कर रहा है क्या आपको एक त्रुटि संदेश मिल रहा है या यह तरीका सिर्फ काम नहीं कर रहा है? क्या आप कुछ अतिरिक्त कोड पोस्ट कर सकते हैं? –

+0

हाँ मुझे एक त्रुटि है: विधि समूह से सिस्टम में कनवर्ट नहीं किया जा सकता है। थ्रेडिंग। पैरामीटरकृत थ्रेडस्टार्ट – elisa

उत्तर

13

विधि आप बुला रहे हैं एक पैरामीटर की आवश्यकता है। आप उपयोग कर सकते हैं क्योंकि यह एक पैरामीटर और शून्य की वापसी प्रकार है निम्नलिखित

ThreadPool.QueueUserWorkItem(o => Method(m)); 

आप इस पद्धति का उपयोग विधि हस्ताक्षर में एक वस्तु को पूर्णांक को बदलने की जरूरत नहीं है।

अपने स्वयं के थ्रेड को मैन्युअल रूप से शुरू करने पर थ्रेडपूल का उपयोग करने के फायदे हैं। Thread vs ThreadPool

+0

मुझे त्रुटि है: "विधि" के लिए कोई ओवरलोड नहीं है "प्रतिनिधि से मेल खाता है" सिस्टम। थ्रेडिंग। वैटकॉलबैक "। कृपया – elisa

+0

वाईकॉलबैक में मदद करें! = प्रतीक्षा करें। अपनी वर्तनी को दोबारा जांचें। –

+0

ठीक है ... गलती के लिए खेद है। लेकिन त्रुटि अभी भी जारी रखें। इसे हल करने के लिए कोई विचार? – elisa

0

प्रयास करें:

Thread t = new Thread(new ThreadStart(method)); 
t.Start(); 
+1

मुझे आपकी विधि का उपयोग करने में त्रुटि है: विधि मिलान सिस्टम के लिए कोई अधिभार नहीं है। थ्रेडिंग। थ्रेडस्टार्ट। – elisa

+0

प्रश्न में उल्लिखित समस्या के अनुसार, थ्रेडस्टार्ट(), पैरामीटरेटेड थ्रेडस्टार्ट() के स्थान पर पैरामीटरयुक्त विधियों के लिए उपयोग किया जाना चाहिए। – Ambuj

8
ThreadStart tsd = new ThreadStart(ThreadMethod); 
Thread t = new Thread(tsd); 
t.Start(); 

थ्रेड तरीकों वापसी प्रकार निरर्थक होगा और तर्क को स्वीकार करने के साथ एक विधि की जरूरत है।

public void ThreadMethod() {.....} 

एक और प्रकार, जिसमें ParameterizedThreadStart

है
ParameterizedThreadStart ptsd = new ParameterizedThreadStart(ThreadParamMethod); 
Thread t = new Thread(ptsd); 
t.Start(yourIntegerValue); 

ThreadParamMethod एक तरीका है जिसके लौट प्रकार शून्य है और प्रकार वस्तु में से एक तर्क को स्वीकार होता है। हालांकि आप ऑब्जेक्ट के रूप में किसी भी चीज को पास कर सकते हैं।

public void ThreadParamMethod(object arg) {.....} 
+0

क्या आप 'ptsd' से छुटकारा पाने और 'थ्रेड टी = नया थ्रेड (थ्रेडपैरएम विधि)' करके 'पैरामीटरेटेड थ्रेडस्टार्ट' उदाहरण को छोटा नहीं कर सकते हैं; क्या संकलक स्वचालित रूप से 'पैरामीटरेटेड थ्रेड स्टार्ट' प्रतिनिधि का निर्माण करेगा? (मैंने ईमानदारी से कोशिश नहीं की है) – Justin

2

विधि एक नहीं वस्तु को पूर्णांक में लेने के लिए ParameterizedThreadStart प्रतिनिधि उपयोग करने में सक्षम होने की जरूरत है।

तो एम को किसी ऑब्जेक्ट में बदलें और इसे पहले int में डालें।

26

आप इसे लैम्ब्डा अभिव्यक्ति का उपयोग करके कर सकते हैं। सी # कंपाइलर स्वचालित रूप से ThreadStart दृश्यों के पीछे प्रतिनिधि बनाता है।

Thread t = new Thread(() => Method(m)); 
t.Start(); 

ध्यान दें कि अगर आप m बाद में अपने कोड में बदलने के लिए, परिवर्तन करता है, तो यह अभी तक Method दर्ज नहीं किया है धागा में प्रचार करेंगे। यदि यह एक समस्या है, तो आपको m की एक प्रति बनाना चाहिए।

+0

यह काम करता है। बहुत धन्यवाद। जस्टिन मैं आपसे पूछना चाहता हूं कि क्या मैं टी का उपयोग करता हूं। स्टार्ट का मतलब है कि हर बार जब मैं इस विधि को कॉल करना चाहता हूं तो मैं कोड चलाने में सक्षम हूं? – elisa

+0

@elisa - नहीं, आपको प्रत्येक कॉल के लिए 'स्टार्ट' के लिए एक नया धागा बनाना होगा। प्रति [थ्रेड.स्टार्ट के प्रलेखन] (http://msdn.microsoft.com/en-us/library/a9fyxz7d.aspx): "एक बार थ्रेड समाप्त हो जाने पर, इसे प्रारंभ करने के लिए किसी अन्य कॉल के साथ पुनरारंभ नहीं किया जा सकता है।" – Justin

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