是否可以从Thread类继承并覆盖Start方法?
答案 0 :(得分:22)
关于为什么有人想要这样做:许多语言(例如Java)和/或线程API(例如Qt)允许开发人员通过继承“线程”基类来实现线程,然后重载一个方法实现线程例程。
在Qt中广泛使用了这个模型,我实际上发现它非常方便 - 而不是让线程针对某些函数或方法,这通常会导致奇怪和/或复杂的代码,整个线程都包含在一个对象中。
以下是使用Qt API的示例代码:
class MyThread : public QThread
{
Q_OBJECT
protected:
void run();
};
void MyThread::run()
{
...something I need threaded...
}
QThread是Qt的线程基类。要使用MyThread,请创建线程对象的实例并调用QThread :: start()。然后,run()重新实现中出现的代码将在一个单独的线程中执行。
这有什么好处,我认为它可以让你真正包含一个线程在一个对象中需要的所有东西,并且(根据我的经验),它构成了一个非常连贯的对象模型。我不认为它符合每个人的需求,但我有点惊讶C#没有这么基本的线程模型,说实话。
我绝对不会因为内核的复杂性而购买C#的Thread类。如果Qt可以提供允许继承QThread的跨平台线程库,我认为MSFT无法在C#中的线程类中提供相同的功能。
答案 1 :(得分:11)
不,Thread
班级是sealed
。这个决定背后的基本原理是,对于内核对象来说,它是一个如此棘手且低级别的包装器,你不应该把它搞乱。
虽然有一个问题,为什么要覆盖Start方法?你想要实现什么目标?
答案 2 :(得分: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();
}
}
答案 3 :(得分:9)
我认为任何继承都不会产生比这更可读的代码:
Thread myThread = new Thread(() =>
{
//Do what you want...
});
myThread.Start();
答案 4 :(得分:7)
不确定为什么你可能想要这样做(或者如果可能的话甚至应该这样做),但是有办法解决Thread
类是sealed
的事实 - 使用扩展方法。从技术上讲,它只是为Start
方法组添加了一个重载(而不是覆盖),但这在您的上下文中可能仍然有用。
这样的事情可能就是你想要的:
public static void Start(this Thread thread, int foo)
{
// Your code here.
thread.Start();
}
然后您可以简单地将其称为:
var thread = new Thread();
thread.Start(123);
答案 5 :(得分:5)
Thread类是密封的,但这里是good site for learning about Threads。另外,请看一下Stackoverflow线程:Multithreading reference?
答案 6 :(得分:2)
没有...
Thread类是密封的......
[ComVisibleAttribute(true)]
[ClassInterfaceAttribute(ClassInterfaceType.None)]
public sealed class Thread : CriticalFinalizerObject,
_Thread
由于
答案 7 :(得分:2)
不,它是一个密封的类,这意味着你不能继承它。
答案 8 :(得分:2)
我也习惯在Java应用程序中使用相同的逻辑,将线程捆绑到一个对象然后进一步将新进程的开始与其父进程分开是非常有意义的。同样,非常失望的C#也不支持这种方法。戴夫P