2012-06-11 9 views
6

Ho una domanda. È possibile e valido, se ho un oggetto con un metodo DoSomething(), se creo più thread per questo metodo, funzionerà e funzionerà come un proprio thread separato?Creazione di più thread per lo stesso metodo su un'istanza su un oggetto

E.g.

public class SomeClass 
{ 
    public void DoSomething() 
    { 
     //somethings done here 
    } 
} 

public class MainProgram 
{ 
    public MainProgram() 
    { 
     InitializeComponents(); 
    } 

    protected override OnStart(string[] args) 
    { 
     SomeClass sc = new SomeClass(); 
     Thread workerOne = new Thread(() => sc.DoSomething()); 
     workerOne.Start(); 

     Thread workerTwo = new Thread(() => sc.DoSomething()); 
     workerTwo.Start(); //start a new thread calling same method 
    } 
} 

Spero che questo tipo di spieghi cosa intendo. Funzionerebbe o causerebbe qualche problema?

Sto scrivendo un programma che deve essere quasi un software in tempo reale, attualmente sto decidendo se inizializzare una nuova istanza di SomeClass è meglio o no?

Spero che qualcuno possa rispondere. Se la mia domanda non ha senso, si prega di commentare e spiegherò ulteriormente!

Grazie,

Base33

PS Il codice è stato scritto appositamente per l'esempio :)

+0

quale versione di C#/.NET siete attivi? – RobertMS

+0

Link obbligatorio: [ebook gratuito di Joe Albahari] (http://www.albahari.com/threading/) –

+0

Sono un programmatore Java. Ma dopo aver dato un'occhiata più da vicino al tuo codice, sembra che tu possa riutilizzare la stessa istanza di SomeClass. Sebbene, solo un thread sarà in grado di eseguire il metodo mentre l'altro attende il suo turno. Questo è ciò che accade in Java. – CKing

risposta

12

Ogni thread ha uno stack di chiamate separato, quindi entrambi possono utilizzare lo stesso metodo sullo stesso oggetto. E infatti, se necessario, ogni thread può (tramite ricorsione) chiamare lo stesso metodo sulla stessa istanza più volte se proprio lo si desidera.

Tuttavia, ciò che potrebbe viaggio in su è se si utilizza stato a tale oggetto (istanza o campi statici, ecc, e tutto ciò che riguarda da quello stato). Sarà necessario assicurarsi che l'accesso a qualsiasi stato condiviso dia piena considerazione (e presumibilmente sincronizzazione) all'accesso multi-thread.

3

Sì, è possibile farlo. Dovrai comunque assicurarti che i tuoi accessi ai membri all'interno di quel metodo siano sicuri.

Se si modifica lo stato dell'oggetto, è necessario bloccare le letture e le scritture (senza parlare di alcun meccanismo particolare) o verificare che sia innocuo interrompere il metodo in qualsiasi momento e che l'altra chiamata su un thread diverso funzionerà ancora correttamente

1

È possibile e valido, se si dispone di un oggetto con un metodo DoSomething(), se creo più thread per questo metodo, funzionerà e verrà eseguito come un proprio thread separato?

Sì, è possibile. Nell'esempio di codice, DoSomething viene chiamato sulla stessa istanza di SomeClass. Entrambi i thread condividono questo. Hai due thread distinti ma un oggetto reale che viene condiviso.

Questo lavoro o causare problemi?

Ciò dipende interamente dal vostro caso d'uso. Può o non può. Se gli oggetti sono condivisi, è necessario sincronizzarne l'accesso.

1

Non ha alcun problema. Corro senza errori.

È proprio come creare un oggetto e un metodo di chiamata su questo oggetto due volte. l'unico fatto è che due occorrenze di chiamare lo stesso metodo sono sul thread diverso .

Problemi correlati