2009-06-01 7 views
13

¿Es posible heredar de la clase Thread y anular el método Start?System.Threading.Thread inheritance

+3

¿Por qué quieres? ¿Qué está tratando de lograr? –

+0

Me gustaría tener buenas probabilidades de que solo quiera pasar uno o más parámetros fuertemente tipados a su método. –

+0

Si quiere pasar un único parámetro fuertemente tipado, debe buscar en ParameterizedThreadStartDelegate pasado al Thread ctor. De esta forma obtendría un tipo seguro de Sobrecarga de inicio. –

Respuesta

8

no creo que ninguna herencia podría dar lugar a un código más legible que esto:

Thread myThread = new Thread(() => 
{ 
    //Do what you want... 
}); 
myThread.Start(); 
+0

además del hilo es una clase sellada que no puede heredar del hilo –

+2

Con suficientes objetos extraños con los que tengo que meterme y realizar un seguimiento dentro del hilo, ciertamente podría. Voy a escribir un hilo que debe cargar dinámicamente un archivo DLL y llamar a los métodos de API en él mientras responde a las solicitudes que llegan desde la red. Necesito más que solo un método para mi hilo; Necesito una clase. – skiphoppy

2

n ...

La clase Thread está sellado ...

[ComVisibleAttribute(true)] 
[ClassInterfaceAttribute(ClassInterfaceType.None)] 
public sealed class Thread : CriticalFinalizerObject, 
    _Thread 

Gracias

11

No, la clase Thread es sealed. La razón de ser de esta decisión es que es un envoltorio tan complicado y de bajo nivel alrededor del objeto kernel que no deberías meterse con él.

Una pregunta para usted, ¿por qué quiere anular el método de inicio? ¿Qué estás intentando lograr?

+0

Lo mismo acerca de por qué uno querría anular el inicio. – jrista

+0

Creo que es muy bueno que solo quiera pasar uno o más parámetros fuertemente tipados a su método. –

2

No, es una clase sellada lo que significa que no puede heredar de ella.

7

No estoy seguro de por qué es posible que desee hacer esto (o incluso hacerlo si fuera posible), pero hay una manera de evitar el hecho de que la clase Thread es sealed - utilizando métodos de extensión. Más técnicamente, solo está agregando una sobrecarga al grupo de métodos Start (en lugar de sobrescribir), pero puede ser útil en su contexto.

Algo como esto podría ser lo que quiere:

public static void Start(this Thread thread, int foo) 
{ 
    // Your code here. 

    thread.Start(); 
} 

continuación, puede simplemente llamar como tal:

var thread = new Thread(); 
thread.Start(123); 
20

En cuanto a por qué alguien querría hacer esto: una gran cantidad de idiomas (por ejemplo, Java) y/o las API de subprocesos (por ejemplo, Qt) permiten a los desarrolladores implementar subprocesos al heredar de una clase base de "subprocesos" y luego sobrecargar un método que implementa la rutina de subprocesos.

Habiendo utilizado este modelo extensivamente en Qt, en realidad lo encuentro muy útil: en lugar de tener los hilos dirigidos a alguna función o método, lo que a menudo conduce a códigos extraños y complicados, todo el hilo está contenido dentro de un objeto .

Aquí es código de ejemplo mediante la API de Qt:

class MyThread : public QThread 
{ 
    Q_OBJECT 

protected: 
    void run(); 
}; 

void MyThread::run() 
{ 
    ...something I need threaded... 
} 

QThread es la clase base de enhebrado de Qt. Para usar MyThread, crea una instancia del objeto thread y llama a QThread :: start(). El código que aparece en la reimplementación de ejecución() se ejecutará en una secuencia separada.

Lo bueno de esto es que creo que realmente le permite contener todo lo que un hilo necesita dentro de un solo objeto, y (en mi experiencia), lo convierte en un modelo de objetos muy coherente. No creo que satisfaga las necesidades de todos, pero me sorprendió un poco que C# no tenga un modelo de subprocesamiento tan básico como para ser honesto.

Definitivamente no creo que la clase Thread de C# esté sellada debido a la complejidad del kernel; si Qt puede suministrar una biblioteca de subprocesos multiplataforma que permita la herencia de QThread, no veo ninguna razón real por la que MSFT no pueda proporcionar la misma capacidad en una clase de subprocesamiento en C#.

+3

Estoy de acuerdo con su respuesta y también he utilizado durante muchos años ese tipo de clase abstracta en mi código C++. – Dave

+0

La verdadera razón es que querían una envoltura delgada. :) Nada impide que alguien cree una envoltura mejor alrededor del envoltorio fino oficial. – Ekevoo

2

También estoy acostumbrado a utilizar la misma lógica en las aplicaciones Java, y tiene mucho sentido agrupar un subproceso en un objeto que luego separa el inicio de un nuevo proceso de su principal. Del mismo modo, muy decepcionado C# no es compatible con este enfoque. David P

11
using System.Threading; 

namespace NGrubb.Threading { 

    public abstract class BaseThread { 
     private Thread m_thread; 

     public BaseThread() { 
      m_thread = new Thread(Run); 
     } 

     public void Start() { 
      m_thread.Start(); 
     } 

     protected abstract void Run(); 
    } 
} 
+0

Realmente no pondría una clase ThreadBase como esta en mi base de código, pero esto hace una plantilla agradable para usar. ¡Gracias! – HappyNomad