¿Es posible heredar de la clase Thread y anular el método Start?System.Threading.Thread inheritance
Respuesta
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();
además del hilo es una clase sellada que no puede heredar del hilo –
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
n ...
La clase Thread está sellado ...
[ComVisibleAttribute(true)]
[ClassInterfaceAttribute(ClassInterfaceType.None)]
public sealed class Thread : CriticalFinalizerObject,
_Thread
Gracias
La clase Thread está sellado, pero aquí hay un good site for learning about Threads. Además, eche un vistazo al hilo de Stackoverflow aquí: Multithreading reference?
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?
Lo mismo acerca de por qué uno querría anular el inicio. – jrista
Creo que es muy bueno que solo quiera pasar uno o más parámetros fuertemente tipados a su método. –
No, es una clase sellada lo que significa que no puede heredar de ella.
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);
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#.
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
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();
}
}
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
- 1. virtual inheritance
- 2. javascript inheritance
- 3. CSS - LESS class inheritance
- 4. ¿Tiene ormlite support inheritance?
- 5. @PrePersist with entity inheritance
- 6. Base enum class inheritance
- 7. C++ friend inheritance?
- 8. XML namespace defaulting/inheritance
- 9. iPhone - UIImagePickerControllerDelegate inheritance
- 10. javascript template inheritance
- 11. Python Decorators and inheritance
- 12. javascript prototype inheritance
- 13. C# base inheritance
- 14. Javascript object inheritance
- 15. C++ inheritance - inaccesible base?
- 16. Java inner class and inheritance
- 17. Addresses, reinterpret_cast y multiple inheritance
- 18. Cheat single inheritance en Java?
- 19. has_many and single table inheritance
- 20. Symfony2 bundle inheritance perdiendo paquetes principales rutas
- 21. struct and class and inheritance (C++)
- 22. javascript prototyped inheritance and object properties
- 23. @BeforeClass and inheritance - orden de ejecución
- 24. por qué boost :: noncopyable require inheritance
- 25. ¿Por qué DataMapper usa mixins vs inheritance?
- 26. Maven pluginManagement configuration inheritance strange behavior
- 27. ¿Cómo implemento class-table-inheritance en Rails?
- 28. Grails/Groovy domain classes inheritance cast
- 29. WinDBG/SOS: ¿Cómo se correlacionan subprocesos administrados a partir de hilos de comando con casos System.Threading.Thread
- 30. Generics vs inheritance (cuando no hay clases de colección involucradas)
¿Por qué quieres? ¿Qué está tratando de lograr? –
Me gustaría tener buenas probabilidades de que solo quiera pasar uno o más parámetros fuertemente tipados a su método. –
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. –