2009-12-17 17 views

Respuesta

27

No. C# maneja los hilos de manera diferente a Java. En lugar de crear subclases de la clase Thread, sólo tiene que crear un nuevo objeto System.Threading.Thread y lo pasa a un delegado ThreadStart (esta es la función donde se hace el trabajo) ..

+5

Nota al margen: en Java, la interfaz 'Runnable' es una alternativa a la subclasificación' Thread', pero aún tienes que crear un nuevo objeto 'Thread', pasando el' Runnable' a un constructor. – Powerlord

+4

Básicamente, ThreadStart * es * el C# exacto equivalente a Runnable de Java. –

+0

@Michel Borgwardt: Yeap, la respuesta es correcta (en esencia) pero está equivocada en la forma en que está escrita. – OscarRyz

4

No es necesario - hilos en C# tomar una instancia de un delegado ThreadStart o ParameterizedThreadStart que son los componentes ejecutables del subproceso que se ejecutará.

3

.Net utiliza los delegados ThreadStart y ParameterizedThreadStart en bootstrap Threads.

Los delegados son ciudadanos de primera clase en .Net, puede mantener una referencia si es necesario.

4

Lo más parecido a una API de subprocesamiento orientada a tareas de alto nivel sería BackgroundWorker. Como otros han mencionado, .NET (y por lo tanto C#) usan delegados para representar un método invocable. Java no tiene ese concepto (punteros de función) y en su lugar utiliza interfaces para objetos llamables.

11

La ThreadStart delegate es esencialmente la misma que la interfaz Runnable. Un delegado es como una interfaz para un único método en lugar de una clase completa, por lo que en realidad es más fácil de implementar que la interfaz Runnable en Java.

MSDN explains about delegates:

delegados e interfaces son similares ya que permiten la separación de especificación e implementación. Múltiples autores independientes pueden producir implementaciones que son compatibles con una especificación especificación. De forma similar, un delegado especifica la firma de un método, y los autores pueden escribir métodos que son compatibles con la especificación delegado . ¿Cuándo debe usar las interfaces y cuándo debe usar los delegados ?

Los delegados son útiles cuando: está siendo llamado

  • Un método único.
  • Una clase puede querer tener múltiples implementaciones de la especificación de método .
  • Es deseable permitir el uso de un método estático para implementar la especificación .
  • Se desea un patrón de diseño similar a un evento (para obtener más información, consulte el Tutorial de eventos ).
  • La persona que llama no tiene necesidad de conocer u obtener el objeto que define el método .
  • El proveedor de la implementación desea "distribuir" la implementación de la especificación a solo unos pocos componentes seleccionados.
  • Se desea una composición fácil.

Interfaces son útiles cuando:

  • La especificación define un conjunto de métodos relacionados que se llamado.
  • Una clase normalmente implementa la especificación solo una vez.
  • La persona que llama de la interfaz desea convertir ao desde el tipo de interfaz para obtener otras interfaces o clases .
6

C# utiliza el delegado ThreadStart en lugar del estilo de 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

Hace C# tiene un equivalente de la interfaz Ejecutable Java?

sí, es ThreadStart

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

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

sería equivalente al siguiente código 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 partir del 2015-09-25 esto aún no se ha implementado para Xamarin, por lo que está atascado con Frankenstein C#/Java opciones para lograr lo mismo que esta respuesta. – codeMonkey

Cuestiones relacionadas