2009-05-01 19 views
28

नीचे दी गई विधि वह है जो मैं उस थ्रेड में करना चाहता हूं:धागा कैसे बनाया जाए?

public void Startup(int port,string path) 
{ 
    Run(path); 
    CRCCheck2(); 
    CRCCheck1(); 
    InitializeCodeCave((ushort)port); 
} 

मैंने कोशिश की कि मुझे गुगलिंग मिल सकती है, लेकिन कुछ भी काम नहीं किया

public void Test(int port,string path) 
{ 
    Thread t = new Thread(Startup(port,path)); 
} 

public void TestA(int port,string path) 
{ 
    Thread t = new Thread(Startup); 
    t.Start (port,path); 
} 

दोनों संकलित नहीं करते हैं, यह कैसे करें ?

+1

काम नहीं करता है, या संकलित नहीं करता है? – Aziz

+0

आपको इस्तेमाल की जाने वाली भाषा निर्दिष्ट करनी चाहिए ताकि मुझे (हमें) अनुमान लगाने की आवश्यकता न हो। यह भी कहना, काम नहीं करना अच्छा होगा। – tuergeist

+1

प्रश्न टैग की जांच करें - सी # यह संकलित नहीं करता है। –

उत्तर

51

निम्नलिखित तरीके काम करते हैं।

// The old way of using ParameterizedThreadStart. This requires a 
// method which takes ONE object as the parameter so you need to 
// encapsulate the parameters inside one object. 
Thread t = new Thread(new ParameterizedThreadStart(StartupA)); 
t.Start(new MyThreadParams(path, port)); 

// You can also use an anonymous delegate to do this. 
Thread t2 = new Thread(delegate() 
{ 
    StartupB(port, path); 
}); 
t2.Start(); 

// Or lambda expressions if you are using C# 3.0 
Thread t3 = new Thread(() => StartupB(port, path)); 
t3.Start(); 

स्टार्टअप विधियों में इन उदाहरणों के लिए निम्नलिखित हस्ताक्षर हैं।

public void StartupA(object parameters); 

public void StartupB(int port, string path); 
+1

मुझे "पुराना तरीका" का उपयोग करते समय त्रुटि मिलती है, लेकिन लैम्बा अभिव्यक्ति सही काम करती है। :) –

+1

आवश्यक स्टार्टअप विधि हस्ताक्षर स्पष्ट करें। –

+0

नाइस - मैंने अभी "पुराने" तरीके से नीचे एक उत्तर पोस्ट किया है, लेकिन यह नहीं पता था कि आप क्लीनर थ्रेड एंट्री पॉइंट बनाने के लिए लैम्ब्डा एक्सप्रेशन का उपयोग कर सकते हैं। –

7

जिस विधि को आप चलाने के लिए चाहते हैं वह ThreadStart Delegate होना चाहिए। एमएसडीएन पर Thread documentation से परामर्श लें। ध्यान दें कि आप बंद करने के साथ अपनी दो-पैरामीटर प्रारंभ को व्यवस्थित कर सकते हैं। कुछ ऐसा:

var t = new Thread(() => Startup(port, path)); 

ध्यान दें कि आप अपनी विधि पहुंच पर फिर से विचार करना चाहेंगे। अगर मैंने इस तरह से अपनी सार्वजनिक विधि पर एक धागा शुरू करने वाला वर्ग देखा, तो मैं थोड़ा आश्चर्यचकित हो जाऊंगा।

+0

मैंने कोशिश की, यह काम नहीं करता है। थ्रेडस्टार्ट टी = नया थ्रेड स्टार्ट (स्टार्टअप); << 'स्टार्टअप' मैचों के लिए कोई ओवरलोड नहीं है 'सिस्टम। थ्रेडिंग। थ्रेडस्टार्ट –

+0

स्टार्टअप दो पैरामीटर लेता है। यदि आप लिंक किए गए दस्तावेज़ों की जांच करते हैं, तो थ्रेडस्टार्ट कोई पैरामीटर नहीं लेता है। हम इसे बंद करने के साथ धोखा दे सकते हैं (3.5 में), या हम पैरामीटरेटेड थ्रेडस्टार्ट का उपयोग कर सकते हैं और दो पैरामीटर को ऑब्जेक्ट (प्री 3.5) में बंडल कर सकते हैं। –

2
public class ThreadParameter 
     { 
      public int Port { get; set; } 
      public string Path { get; set; } 
     } 


Thread t = new Thread(new ParameterizedThreadStart(Startup)); 
t.Start(new ThreadParameter() { Port = port, Path = path}); 

पोर्ट और पथ ऑब्जेक्ट्स के साथ एक ऑब्जेक्ट बनाएं और इसे स्टार्टअप विधि में पास करें।

+0

जब मैं आपकी पहली पंक्ति लिखता हूं, तो मुझे "स्टार्टअप" के लिए कोई अधिभार नहीं मिलता है 'सिस्टम' थ्रेडिंग। पैरामीटरेटेड थ्रेडस्टार्ट " –

+0

स्टार्टअप को" शून्य स्टार्टअप (ऑब्जेक्ट पैरामीटर) "होना आवश्यक है। आप "शून्य स्टार्टअप (थ्रेड पैरामीटर पैरामीटर)" का उपयोग नहीं कर सकते हैं क्योंकि आप उस ऑब्जेक्ट को उस पर पास नहीं कर सकते हैं। आप ऑब्जेक्ट पैरामीटर को स्टार्टअप के अंदर थ्रेड पैरामीटर पर डाल सकते हैं। –

+0

आपको थ्रेड पैरामीटर वर्ग ..... (कक्षा 2 पैरामीटर के साथ बनाई गई कक्षा) को स्वीकार करने के लिए स्टार्टअप विधि के हस्ताक्षर को बदलना होगा। – CSharpAtl

2

आपका उदाहरण विफल रहता है क्योंकि थ्रेड विधियां या तो एक या शून्य तर्क लेती हैं। गुजर तर्क के बिना एक धागा बनाने के लिए अपने कोड इस तरह दिखता है:

void Start() 
{ 
    // do stuff 
} 

void Test() 
{ 
    new Thread(new ThreadStart(Start)).Start(); 
} 

आप धागा करने के लिए डेटा पास करना चाहते हैं, तो आप एक वस्तु पर अपना डेटा को संपुटित करने की जरूरत है, चाहे वह की एक कस्टम वर्ग है आपके स्वयं का डिज़ाइन, या एक शब्दकोश ऑब्जेक्ट या कुछ और। फिर आप तो जैसे, ParameterizedThreadStart प्रतिनिधि उपयोग करने की आवश्यकता:

void Start(object data) 
{ 
    MyClass myData = (MyClass)myData; 
    // do stuff 
} 

void Test(MyClass data) 
{ 
    new Thread(new ParameterizedThreadStart(Start)).Start(data); 
} 
7

मैं System.Threading.Tasks से टास्क फैक्टरी की तरह। उस कार्य कारखाने ContinueWith की तरह आप अतिरिक्त सुविधा के विकल्प देता है

Task.Factory.StartNew(() => 
{ 
    // Whatever code you want in your thread 
}); 

नोट:: आप कुछ इस तरह कर सकते हैं

Task.Factory.StartNew(() => {}).ContinueWith((result) => 
{ 
    // Whatever code should be executed after the newly started thread. 
}); 

भी ध्यान रखें कि किसी कार्य के धागे से कुछ भिन्न अवधारणा है। वे एसिंक/प्रतीक्षा कीवर्ड के साथ अच्छी तरह से फिट हैं, here देखें।

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