2010-08-30 10 views

risposta

23
Thread thread = new Thread(() => Send(arg1, arg2, arg3)); 
thread.Start(); 
+0

@ prateeksaluja20: Ho modificato questa risposta per usare il nome del tuo metodo. È più chiaro? – Timwi

+0

mi sembra buono, in alternativa puoi avvolgere l'intera funzionalità di sendthread nella sua classe http://paste.pocoo.org/show/256213/ –

+0

@ f00 perché impiegare tempo e sforzi per creare una classe di chiusura quando il compilatore lo fa per te? – Will

2

È possibile definire un tipo, che incapsula i parametri che si desidera passare e avviare il thread con un riferimento a un'istanza di questo tipo.

+0

quando giù di voto, si prega di lasciare un commento. Grazie. –

+0

buona risposta, ma per quanto riguarda l'interruzione del thread? –

+0

f00: Non sono sicuro di seguirti qui. Cosa intendi? Non c'è niente di speciale in un thread che viene avviato con un riferimento a un oggetto. –

1

è possibile definire un oggetto metodo e di supporto intermedio per fare questo:

public void MethodToCallInThread(string param1, string param2) 
{ 
    ... 
} 
public void HelperMethod(object helper){ 
    var h = (HelperObject) helper; 
    MethodToCallInThread(h.param1, h.param2); 
} 

E poi si inizia il filo con il HelperMethod, non con MethodToCallInThread:

var h = new HelperObject { param1 = p1, param2 = p2 } 
ThreadPool.QueueUserWorkItem(HelperMethod, h); 
+0

Qualcuno può spiegare il -1 ?? –

+0

ho avuto lo stesso :). è una situazione stupida comune ... mi piace il colore rosso, ma ad altri piace il giallo :) e odio tutti i NON-rosso-divertimento. – garik

+0

Sospetto che il -1 sia per l'utilizzo di uno stile antico di parametri di passaggio che è davvero piuttosto ingombrante rispetto al nuovo stile disponibile nelle versioni moderne di C#. –

-1

questo può aiutare. È possibile definire il metodo di invio come segue e quindi utilizzare i parametri.

string[] parameters = new string[3]; 
parameters[0] = arg1; 
parameters[1] = arg2; 
parameters[1] = arg3; 

System.Threading.Thread SendingThread = new System.Threading.Thread(Send); 
SendingThread.Start(parameters); 


public void Send(object parameters) 
{ 
    Array arrayParameters = new object[3]; 
    arrayParameters = (Array)parameters; 
    string str1 = (string)arrayParameters.GetValue(0); 
    string str2 = (string)arrayParameters.GetValue(1); 
    string str3 = (string)arrayParameters.GetValue(2); 

    ///Following code here... 
} 
+2

① Questo rimuove inutilmente tutti i tipi di sicurezza.(Inutilmente perché potresti semplicemente passare le stringhe invece di un oggetto.) ② L'uso di 'Array' è davvero strano. Perché non eseguire il cast di 'string []' direttamente? ③ Perché stai allocando un 'nuovo oggetto [3]' e poi lo hai immediatamente obsoleto? È ridondante. ④ Che cos'è 'ReceiveMsgThread'? Non l'hai dichiarato da nessuna parte. ⑤ Cosa fa questa risposta che il mio non fa (oltre a distruggere la sicurezza del tipo)? – Timwi

+2

Come evidenziato da Timwi, questo codice presenta numerosi problemi nonostante sia la risposta accettata. Per favore non usare questo. –

+0

@Timwi: prima di tutto sì invece di ReceiveMsgThread dovrebbe essere SendingThread. Mi dispiace per questo. In secondo luogo, l'ho preso come array perché non è possibile eseguire il cast di un tipo di oggetto su string [] direttamente. Ho passato la stringa [] nei parametri dell'argomento, come faresti a separare le stringhe separate dai parametri dell'oggetto. Devi lanciarlo come array ed estrarre i valori da quell'array gettandolo come stringa. Perché non provi e controlla se è possibile. E anche nei parametri dell'oggetto, possiamo passare string, int, quindi su tipi diversi e quindi estrarre i tipi corrispondenti più tardi. –

Problemi correlati