2013-06-15 6 views
8

Sto cercando di eseguire 3 livelli di timer al tempo stesso in un'applicazione C# ad esempio:metodi di chiamata in thread principale da altri thread

T1 verrà eseguito all'inizio del l'applicazione, quindi sulla sua Tick evento, T2 inizierà e quindi sull'evento tick di T2, inizierà T3. Infine, l'evento Tick di T3, qualcosa deve essere fatto nel thread principale dell'applicazione

Il mio problema sembra essere che il codice nel thread principale non funziona quando viene chiamato da un altro thread

Cosa devo fare per consentire al thread principale di eseguire le sue funzioni tramite una chiamata da altri thread?

+0

Puoi mostrarci il tuo codice? – Kurubaran

+0

Qual è il problema ** business * che stai cercando di risolvere? –

+0

Classe C1 { Timer T1; C2 c2; OnT1Tick() { c2.T2.start() }} Classe C2 { Timer T2 C3 C3; OnT2Tick() { c3.T3.start }} Classe C3 { Timer T3 OnT3Tick() { system.console.write ("qualcosa"); }} Il problema è che lo system.console.write viene chiamato dal thread principale e ogni timer sta creando un nuovo thread – user2302005

risposta

16

Molto probabilmente il problema è che il thread principale richiede l'invocazione. Se si eseguirà il programma in debugger, si dovrebbe vedere l'eccezione Operazione cross-thread, ma in fase di esecuzione questo controllo delle eccezioni è disabilitato.

Se il thread principale è un modulo, è possibile gestire con questo codice funzione:

if (InvokeRequired) 
{ 
    this.Invoke(new Action(() => MyFunction())); 
    return; 
} 

o .NET 2,0

this.Invoke((MethodInvoker) delegate {MyFunction();}); 

EDIT: per un'applicazione console si può provare seguenti:

var mydelegate = new Action<object>(delegate(object param) 
    { 
    Console.WriteLine(param.ToString()); 
    }); 
    mydelegate.Invoke("test"); 
+0

Il mio thread principale è console, fa lo stesso? – user2302005

+0

In realtà, sarà una funzione di unità3D Ma attualmente sto lavorando alle classi – user2302005

+0

@ user2302005 vedere la mia modifica – VladL