2009-05-06 12 views
31

क्या कोई जानता है कि थ्रेड में एकाधिक पैरामीटर कैसे पास करें। नियमित रूप से प्रारंभ करें?एकाधिक पैरामीटर के साथ धागा

मैंने कक्षा को विस्तारित करने के बारे में सोचा, लेकिन सी # थ्रेड क्लास को सील कर दिया गया।

... 
    Thread standardTCPServerThread = new Thread(startSocketServerAsThread); 

    standardServerThread.Start(orchestrator, initializeMemberBalance, arg, 60000); 
... 
} 

static void startSocketServerAsThread(ServiceOrchestrator orchestrator, List<int> memberBalances, string arg, int port) 
{ 
    startSocketServer(orchestrator, memberBalances, arg, port); 
} 

Btw, मैं अलग वाद्यवृंदकार, संतुलन और बंदरगाहों के साथ धागे के एक नंबर शुरू:

यहाँ मैं क्या सोचते हैं की तरह कोड लगेगा है। कृपया थ्रेड सुरक्षा पर भी विचार करें।

उत्तर

56

करने की जरूरत है एक लैम्ब्डा अभिव्यक्ति का उपयोग करते हुए तर्क पर कब्जा करने की कोशिश करो।

Thread standardTCPServerThread = 
    new Thread(
    unused => startSocketServerAsThread(initializeMemberBalance, arg, 60000) 
); 
+0

एक अलग धागे पर अभिव्यक्ति निष्पादित करने के लिए कितना सुरक्षित है? –

+7

यह सुरक्षित है - चेतावनी के साथ।यह कुछ अजीब साइड इफेक्ट्स हो सकता है, हालांकि, अगर आप इसे कॉल करने के तुरंत बाद अपने चर को ट्विक करते हैं, क्योंकि आप प्रभावी रूप से संदर्भ में चर को पार कर रहे हैं। –

+0

इसे थ्रेड सुरक्षित बनाने के तरीके पर कोई विचार? –

11

आपको उन्हें एक ही ऑब्जेक्ट में लपेटने की आवश्यकता है।

अपने पैरामीटर में पास करने के लिए कस्टम क्लास बनाना एक विकल्प है। आप ऑब्जेक्ट्स की सरणी या सूची का भी उपयोग कर सकते हैं, और उसमें अपने सभी पैरामीटर सेट कर सकते हैं।

3

आप नहीं कर सकते। ऐसी ऑब्जेक्ट बनाएं जिसमें आपको आवश्यक पैराम शामिल हों, और पास करें। थ्रेड फ़ंक्शन में ऑब्जेक्ट को इसके प्रकार पर वापस डाला गया।

1

आप ऑब्जेक्ट सरणी ले सकते हैं और इसे थ्रेड में पास कर सकते हैं।

System.Threading.ParameterizedThreadStart(yourFunctionAddressWhichContailMultipleParameters) 

थ्रेड कन्स्ट्रक्टर में पास करें।

yourFunctionAddressWhichContailMultipleParameters(object[]) 

आप पहले से ही objArray में सभी मान निर्धारित करते हैं।

आप abcThread.Start(objectArray)

0

आप एक लैम्ब्डा अभिव्यक्ति के साथ "काम" समारोह करी सकता है:

public void StartThread() 
{ 
    // ... 
    Thread standardTCPServerThread = new Thread(
     () => standardServerThread.Start(/* whatever arguments */)); 

    standardTCPServerThread.Start(); 
} 
+0

मिमी मिमी भेड़ का बच्चा करी। – Pete

7

'टास्क' पैटर्न का उपयोग करें:

public class MyTask 
{ 
    string _a; 
    int _b; 
    int _c; 
    float _d; 

    public event EventHandler Finished; 

    public MyTask(string a, int b, int c, float d) 
    { 
     _a = a; 
     _b = b; 
     _c = c; 
     _d = d; 
    } 

    public void DoWork() 
    { 
     Thread t = new Thread(new ThreadStart(DoWorkCore)); 
     t.Start(); 
    } 

    private void DoWorkCore() 
    { 
     // do some stuff 
     OnFinished(); 
    } 

    protected virtual void OnFinished() 
    { 
     // raise finished in a threadsafe way 
    } 
} 
9

यहाँ कोड का एक सा का उपयोग करता है ऑब्जेक्ट सरणी दृष्टिकोण यहां दो बार उल्लेख किया गया है।

... 
    string p1 = "Yada yada."; 
    long p2 = 4715821396025; 
    int p3 = 4096; 
    object args = new object[3] { p1, p2, p3 }; 
    Thread b1 = new Thread(new ParameterizedThreadStart(worker)); 
    b1.Start(args); 
    ... 
    private void worker(object args) 
    { 
     Array argArray = new object[3]; 
     argArray = (Array)args; 
     string p1 = (string)argArray.GetValue(0); 
     long p2 = (long)argArray.GetValue(1); 
     int p3 = (int)argArray.GetValue(2); 
     ... 
    }> 
+0

@ ओपस मुझे लगता है कि लैम्ब्डा अभिव्यक्ति, जेरेडपायर का समाधान, बनाए रखना आसान है (पढ़ना, समझना और अपडेट करना) –

5

नेट 2 JaredPar के रूपांतरण का जवाब

Thread standardTCPServerThread = new Thread(delegate (object unused) { 
     startSocketServerAsThread(initializeMemberBalance, arg, 60000); 
    }); 
2

मैं पता लगाने के लिए यह कैसे करना है तुम्हारा मंच पढ़ रहा है और मैं है कि रास्ते में यह किया - किसी के लिए उपयोगी हो सकता है। मैं कन्स्ट्रक्टर में तर्क पास करता हूं जो मेरे लिए काम करने वाले थ्रेड बनाता है जिसमें मेरी विधि को निष्पादित किया जाएगा - निष्पादित करें() विधि।

using System; 

using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Diagnostics; 
using System.Windows.Forms; 
using System.IO; 
using System.Threading; 
namespace Haart_Trainer_App 

{ 
    class ProcessRunner 
    { 
     private string process = ""; 
     private string args = ""; 
     private ListBox output = null; 
     private Thread t = null; 

    public ProcessRunner(string process, string args, ref ListBox output) 
    { 
     this.process = process; 
     this.args = args; 
     this.output = output; 
     t = new Thread(new ThreadStart(this.execute)); 
     t.Start(); 

    } 
    private void execute() 
    { 
     Process proc = new Process(); 
     proc.StartInfo.FileName = process; 
     proc.StartInfo.Arguments = args; 
     proc.StartInfo.UseShellExecute = false; 
     proc.StartInfo.RedirectStandardOutput = true; 
     proc.Start(); 
     string outmsg; 
     try 
     { 
      StreamReader read = proc.StandardOutput; 

     while ((outmsg = read.ReadLine()) != null) 
     { 

       lock (output) 
       { 
        output.Items.Add(outmsg); 
       } 

     } 
     } 
     catch (Exception e) 
     { 
      lock (output) 
      { 
       output.Items.Add(e.Message); 
      } 
     } 
     proc.WaitForExit(); 
     var exitCode = proc.ExitCode; 
     proc.Close(); 

    } 
} 
} 
2
void RunFromHere() 
{ 
    string param1 = "hello"; 
    int param2 = 42; 

    Thread thread = new Thread(delegate() 
    { 
     MyParametrizedMethod(param1,param2); 
    }); 
    thread.Start(); 
} 

void MyParametrizedMethod(string p,int i) 
{ 
// some code. 
} 
0

आप एक ही वस्तु पारित करने के लिए की जरूरत है, लेकिन अगर यह बहुत ज्यादा परेशानी एक एकल उपयोग के लिए अपनी खुद की वस्तु को परिभाषित करने के लिए, आप एक टपल उपयोग कर सकते हैं।

+0

mcmillab उदाहरण उदाहरण? –

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