2009-12-17 10 views

risposta

27

No. C# gestisce i thread in modo diverso da Java. Invece di sottoclasse la classe Thread, devi semplicemente creare un nuovo oggetto System.Threading.Thread e passarlo a un delegato ThreadStart (questa è la funzione in cui lavori) ..

+5

Nota a margine: in Java, l'interfaccia 'Runnable' è un'alternativa alla sottoclasse di' Thread', ma devi comunque creare un nuovo oggetto 'Thread', passando il' Runnable' a un costruttore. – Powerlord

+4

Fondamentalmente, ThreadStart * è * l'esatto C# equivalente a Runnable di Java. –

+0

@ Michel Borgwardt: Yeap, la risposta è corretta (in sostanza) ma sbagliata nel modo in cui è scritta. – OscarRyz

4

Non è necessario - i thread in C# prendono un istanza di un delegato o ParameterizedThreadStart che sono i componenti eseguibili del thread da eseguire.

3

.Net utilizza i delegati ThreadStart e ParameterizedThreadStart per avviare i thread.

I delegati sono cittadini di prima classe in .Net, è possibile mantenere un riferimento in giro se necessario.

4

Il più vicino a un'API di threading orientata all'attività di alto livello sarebbe un BackgroundWorker. Come altri hanno menzionato, .NET (e quindi C#) usa delegati per rappresentare un metodo callable. Java non ha questo concetto (puntatori di funzione) e utilizza invece interfacce per gli oggetti chiamabili.

11

Lo ThreadStart delegate è essenzialmente uguale all'interfaccia Runnable. Un delegato è come un'interfaccia per un singolo metodo piuttosto che un'intera classe, quindi è in realtà più semplice da implementare rispetto all'interfaccia Runnable in Java.

MSDN explains about delegates:

delegati e le interfacce sono simili in quanto consentono la separazione di specifica e implementazione. Gli autori indipendenti multipli possono produrre implementazioni compatibili con un'interfaccia . Analogamente, un delegato specifica la firma di un metodo, e gli autori possono scrivere metodi che sono compatibili con la specifica del delegato . Quando è necessario utilizzare le interfacce e quando utilizzare i delegati ?

delegati sono utili quando:

  • Un unico metodo viene chiamato.
  • Una classe potrebbe voler disporre di più implementazioni della specifica del metodo .
  • È consigliabile consentire l'utilizzo di un metodo statico per implementare la specifica .
  • Si desidera un motivo di progettazione di tipo evento (per ulteriori informazioni, consultare l'Esercitazione sugli eventi ).
  • Il chiamante non ha bisogno di conoscere o ottenere l'oggetto in cui è definito il metodo .
  • Il fornitore dell'implementazione desidera "distribuire" l'implementazione della specifica allo solo alcuni componenti di selezione.
  • È richiesta una composizione facile.

interfacce sono utili quando:

  • La specifica definisce un insieme di metodi correlati che saranno chiamati .
  • Una classe di solito implementa la specifica solo una volta.
  • Il chiamante dell'interfaccia desidera eseguire il cast da o verso l'interfaccia per ottenere altre interfacce o classi .
6

C# utilizza il delegato ThreadStart invece dello stile di Java Runnable.

public class Foo 
{ 

    public void DoStuff() 
    { 
     while (true) 
     { 
     // do some stuff 
     } 
    } 
}; 

public class Bar 
{ 
    public static int Main() 
    { 
     Foo foo = new Foo(); 
     // create a ThreadStart delegate and pass in the method that will run 
     // (similar to run on Java's Runnable) 
     Thread thread = new Thread(new ThreadStart(foo.DoStuff)); 
     thread.Start(); 
    } 
} 
48

Fa C# hanno un equivalente dell'interfaccia Runnable Java?

Sì, è ThreadStart

class Runner 
{ 
    void SomeMethod() 
    { 
     Thread newThread = new Thread(new ThreadStart(Run)); 
     newThread.Start(); 
    } 

    public void Run() 
    { 
      Console.WriteLine("Running in a different thread.") 
    } 
} 

sarebbe equivalente al seguente codice Java

class Runner implements Runnable { 

    void someMethod() { 
     Thread newThread = new Thread(this); 
     newThread.start(); 
     } 

     public void run() { 
      out.println("Running in a different thread."); 
     } 
    } 
+0

A partire dal 2015-09-25 questo deve ancora essere implementato per Xamarin, quindi sei bloccato con le opzioni di Frankenstein C#/Java per ottenere lo stesso risultato di questa risposta. – codeMonkey