System.Threading.Thread继承

Dav*_*ave 13 c# multithreading

是否可以从Thread类继承并覆盖Start方法?

use*_*967 22

关于为什么有人想要这样做:许多语言(例如Java)和/或线程API(例如Qt)允许开发人员通过继承"线程"基类来实现线程,然后重载实现线程的方法常规.

在Qt中广泛使用了这个模型,我实际上发现它非常方便 - 而不是让线程针对某些函数或方法,这通常会导致奇怪和/或复杂的代码,整个线程都包含在一个对象中.

以下是使用Qt API的示例代码:

class MyThread : public QThread
{
    Q_OBJECT

protected:
    void run();
};

void MyThread::run()
{
    ...something I need threaded...
}
Run Code Online (Sandbox Code Playgroud)

QThread是Qt的线程基类.要使用MyThread,请创建线程对象的实例并调用QThread :: start().然后,run()重新实现中出现的代码将在单独的线程中执行.

这样做的好处是我认为它可以让你真正包含线程在单个对象中所需的所有东西,并且(根据我的经验),它构成了一个非常连贯的对象模型.我不认为它符合每个人的需求,但我有点惊讶C#没有这么基本的线程模型说实话.

我绝对不会因为内核的复杂性而购买C#的Thread类.如果Qt可以提供允许继承QThread的跨平台线程库,我认为MSFT无法在C#中的线程类中提供相同的功能.

  • 我同意你的回应,并且在我的C++代码中也使用了很多年的那种抽象类. (4认同)

Yan*_*rtz 11

不,Thread班级是sealed.这个决定背后的基本原理是它是围绕内核对象的一个​​棘手和低级别的包装器,你不应该搞乱它.

但是有一个问题,为什么要覆盖Start方法呢?你想要实现什么目标?


小智 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();
    }
}
Run Code Online (Sandbox Code Playgroud)


Cai*_*lye 9

我认为任何继承都不会产生比这更可读的代码:

Thread myThread = new Thread(() =>
{
    //Do what you want...
});
myThread.Start();
Run Code Online (Sandbox Code Playgroud)

  • 有足够奇怪的物体,我必须弄乱并跟踪线程内部,它当然可以.我将编写一个线程,它必须动态加载DLL并在其上调用API方法,同时响应来自网络的请求.我需要的不仅仅是一个方法,我的线程; 我需要一堂课. (2认同)

Nol*_*rin 7

不确定为什么你可能想要这样做(或者如果可能的话甚至应该这样做),但是有一种方法可以解决Thread类的问题sealed- 使用扩展方法.从技术上讲,它只是在Start方法组中添加了一个重载(而不是覆盖),但这在您的上下文中可能仍然有用.

这样的事情可能就是你想要的:

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

    thread.Start();
}
Run Code Online (Sandbox Code Playgroud)

然后你可以简单地称它为:

var thread = new Thread();
thread.Start(123);
Run Code Online (Sandbox Code Playgroud)


Jea*_*rdi 5

Thread类是密封的,但这里是学习Threads好网站.另外,请看一下Stackoverflow线程:多线程参考?