System.Threading.Thread наследование - PullRequest
13 голосов
/ 01 июня 2009

Можно ли наследовать от класса Thread и переопределить метод Start?

Ответы [ 9 ]

22 голосов
/ 10 июня 2009

Относительно того, почему кто-то хотел бы сделать это: множество языков (например, Java) и / или потоковых API (например, Qt) позволяют разработчикам реализовывать потоки, наследуя их от базового класса «thread», а затем перегружая метод, который реализует подпрограмму потока.

При интенсивном использовании этой модели в 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 # не имеет такой базовой модели потоков, чтобы быть честным.

Я определенно не куплю, что класс Thread в C # запечатан из-за сложности ядра; если Qt может предоставить кроссплатформенную библиотеку потоков, которая позволяет наследовать QThread, я не вижу реальной причины, по которой MSFT не может обеспечить такую ​​же возможность в классе потоков в C #.

11 голосов
/ 01 апреля 2010
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();
    }
}
11 голосов
/ 01 июня 2009

Нет, класс Thread равен sealed. Обоснование этого решения заключается в том, что это такая хитрая и низкоуровневая оболочка вокруг объекта ядра, что вам не следует с ней связываться.

Хотя один вопрос для вас, почему вы хотите переопределить метод Start? Чего ты пытаешься достичь?

9 голосов
/ 28 ноября 2012

Я не думаю, что любое наследование может привести к более читаемому коду, чем это:

Thread myThread = new Thread(() =>
{
    //Do what you want...
});
myThread.Start();
7 голосов
/ 01 июня 2009

Не знаю, почему вы можете захотеть сделать это (или даже должны сделать это, если это возможно), но есть способ обойти тот факт, что класс 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 голосов
/ 01 июня 2009

Класс Thread запечатан, но вот хороший сайт для изучения потоков . Кроме того, посмотрите на поток Stackoverflow здесь: Ссылка на многопоточность?

2 голосов
/ 24 августа 2009

Я также привык использовать ту же логику в приложениях Java, и имеет серьезный смысл объединять поток в объект, который затем дополнительно отделяет начало нового процесса от его родителя. Кроме того, очень разочарован C # не поддерживает этот подход. Дейв П

2 голосов
/ 01 июня 2009

Нет, это закрытый класс, что означает, что вы не можете наследовать от него.

2 голосов
/ 01 июня 2009

Нет ...

Класс Thread запечатан ...

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

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...