2010-07-29 19 views
226

सी # में Thread.ThreadStart() विधि के पैरामीटर कैसे पास करें?थ्रेड में थ्रेडस्टार्ट विधि में पैरामीटर कैसे पास करें?

मान लीजिए मैं विधि 'डाउनलोड'

public void download(string filename) 
{ 
    // download code 
} 

कहा जाता है अब मैं मुख्य विधि में एक धागा बनाया है:

Thread thread = new Thread(new ThreadStart(download(filename)); 

त्रुटि विधि प्रकार की उम्मीद।

पैरामीटर के साथ लक्ष्य विधि के साथ ThreadStart पर पैरामीटर कैसे पास कर सकते हैं?

+2

चेक [इस] (http: //www.yoda.arachsys।कॉम/सीएसआरआरपी/धागे /) जॉन स्कीट द्वारा लिखित आलेख पैरामीटर अनुभाग अगले पृष्ठ पर है लेकिन संपूर्ण लेख पूरी तरह से पढ़ा गया है। – codingbadger

उत्तर

570

सरलतम सिर्फ

string filename = ... 
Thread thread = new Thread(() => download(filename)); 
thread.Start(); 

इसका लाभ (रों) (ParameterizedThreadStart से अधिक) है कि आप एक से अधिक पैरामीटर पारित कर सकते हैं, और आप संकलन समय जाँच object से हर समय कास्ट करने के लिए जरूरत के बिना प्राप्त ।

+14

मुझे ऑफटॉप के लिए खेद है लेकिन '()' ऑपरेटर का क्या अर्थ है? मैं इसे कभी-कभी देखता हूं लेकिन मेरे पास जांच करने का कोई समय नहीं है। –

+21

यह कोई तर्क के साथ एक लैम्ब्डा अभिव्यक्ति है। – Noldorin

+29

@ ŁukaszW.pl - क्या नोल्डोरिन ने कहा; सी # 2.0 में पी वैकल्पिक विकल्प (इस उदाहरण के लिए) 'नया थ्रेड (प्रतिनिधि() {डाउनलोड (फ़ाइल नाम);}) है; ' –

20

आप पैरामीटर लेने वाले थ्रेड विधियों के लिए ParameterizedThreadStart प्रतिनिधि का उपयोग करना चाहते हैं। (या बिल्कुल भी नहीं वास्तव में, और Thread निर्माता अनुमान करते हैं।)

उदाहरण उपयोग:

public void RunWorker() 
{ 
    Thread newThread = new Thread(WorkerMethod); 
    newThread.Start(ParameterObject); 
} 

public void WorkerMethod(object parameterObject) 
{ 
    // do your job! 
} 

आप पहली बार प्रतिनिधि पास करके एक धागा पैदा कर रहे: इस उदाहरण को

var thread = new Thread(new ParameterizedThreadStart(download)); 
//var thread = new Thread(download); // equivalent 

thread.Start(filename) 
28

देखो कार्यकर्ता विधि के लिए और उसके बाद इसे थ्रेड के साथ शुरू होता है। स्टार्ट विधि जो आपके ऑब्जेक्ट को पैरामीटर के रूप में ले जाती है।

तो आपके मामले में आप इसे इस प्रकार उपयोग करना चाहिए:

Thread thread = new Thread(download); 
    thread .Start(filename); 

लेकिन अपने 'डाउनलोड' पद्धति अभी भी वस्तु, एक पैरामीटर के रूप में नहीं स्ट्रिंग लेने के लिए की जरूरत है। आप इसे अपने विधि शरीर में स्ट्रिंग करने के लिए डाल सकते हैं।

+3

क्या यह वास्तव में काम करता है? – Mukus

+1

मेरी कोशिश में नहीं। –

4

आप सकता also delegate तरह इतना ...

ThreadStart ts = delegate 
{ 
     bool moreWork = DoWork("param1", "param2", "param3"); 
     if (moreWork) 
     { 
      DoMoreWork("param1", "param2"); 
     } 
}; 
new Thread(ts).Start(); 
0

कैसे बारे इस: (या है यह ok को use तरह इस?)

var test = "Hello"; 
new Thread(new ThreadStart(() => 
{ 
    try 
    { 
     //Staff to do 
     Console.WriteLine(test); 
    } 
    catch (Exception ex) 
    { 
     throw; 
    } 
})).Start(); 
2

आप कैन encapsulate thread समारोह (डाउनलोड) और एक वर्ग में आवश्यक पैरामीटर (फ़ाइल नाम) और थ्रेड स्टार्ट निष्पादित करने के लिए थ्रेड स्टार्ट प्रतिनिधि का उपयोग करें।

public class Download 
{ 
    string _filename; 

    Download(string filename) 
    { 
     _filename = filename; 
    } 

    public void download(string filename) 
    { 
     //download code 
    } 
} 

Download = new Download(filename); 
Thread thread = new Thread(new ThreadStart(Download.download); 
+0

मुझे यह दृष्टिकोण बहुत बेहतर लगता है, मैंने पाया कि लैम्ब्डा अभिव्यक्ति दृष्टिकोण हमेशा सही पैरामीटर का ट्रैक नहीं रखता है – meanbunny

0

यहाँ सही तरीका है ...

private void func_trd(String sender) 
{ 

    try 
    { 
     imgh.LoadImages_R_Randomiz(this, "01", groupBox, randomizerB.Value); // normal code 

     ThreadStart ts = delegate 
     { 
      ExecuteInForeground(sender); 
     }; 

     Thread nt = new Thread(ts); 
     nt.IsBackground = true; 

     nt.Start(); 

    } 
    catch (Exception) 
    { 

    } 
} 

private void ExecuteInForeground(string name) 
{ 
    //whatever ur function 
    MessageBox.Show(name); 
} 
1

में बाहर अतिरिक्त

Thread thread = new Thread(delegate() { download(i); }); 
    thread.Start(); 
संबंधित मुद्दे