ho questo semplice codice:problemi di threading in C# da processo esterno
public void Run()
{
var invokerThread = new Thread(new ThreadStart(RunOnBackground));
invokerThread.Start();
}
private void RunOnBackground()
{
Trace.WriteLine("hi");
...
}
Purtroppo durante l'esecuzione di questo codice (da processo di terze parti) il filo non realmente eseguito. O in Process Explorer e nel debugger VS vedo che il thread è stato creato e il suo stato è "In esecuzione".
L'appartamento del thread principale è STA e ho provato sia STA che MTA su thread interno.
Quando aggiungo al metodo Run()
al termine invokerThread.Join();
, il thread viene eseguito. Ma poi di nuovo non aiuta davvero.
Cosa mi manca?
Edit: Ecco qualche informazione in più per quanto riguarda il codice di hosting -
Run()
metodo viene chiamato tramite l'interoperabilità COM da un processo che è anche riuscito assembly eseguibile (l'interoperabilità ragione COM viene utilizzato è perché tutti gli altri componenti del il sistema è nativo).
Il metodo RunOnBackground()
include un po 'più di codice dopo la traccia e in genere la sua esecuzione dura tra 10 e 20 secondi, incluso l'avvio di un altro processo e in attesa della sua conclusione. Inoltre ho alcune altre aree nel codice in cui scrivo alcune informazioni di debug su Trace. Durante il debug del codice, Run()
viene eseguito come al solito e dopo invokerThread.Start();
lo stato di invokerThread è "In esecuzione" (anche se i punti di interruzione all'interno del metodo RunOnBackground()
non si fermano).
Quando aggiungo invokerThread.Join()
alla fine del metodo Run()
il debugger va a RunOnBackground()
dopo il Join()
.
Non si dovrebbe mostrare un MessageBox all'interno del thread di lavoro. Modifica per utilizzare Trace –
Aggiornamento del codice. Ancora non funziona. Per favore, vedi la risposta che ho scritto a Martin. – Aaron
Hai detto: "Sfortunatamente quando si esegue questo codice (da processi di terze parti) il thread non viene eseguito realmente". Come stai esattamente "eseguendo questo codice"? –