簡體   English   中英

System.Threading.Thread繼承

[英]System.Threading.Thread inheritance

是否可以從Thread類繼承並重寫Start方法?

關於為什么有人想要這樣做:許多語言(例如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#的線程類中提供相同功能的真正原因。

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();
    }
}

不, Thread類是sealed 該決定背后的理由是,它是圍繞內核對象的棘手且低級的包裝程序,因此您不應對此感到困惑。

不過,您有一個問題,為什么要覆蓋Start方法? 您想達到什么目的?

我認為任何繼承都不會導致比這更可讀的代碼:

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

不知道為什么要這樣做(或者甚至應該這樣做),但是有一種方法可以解決Thread類被sealed的事實-使用擴展方法。 從技術上講,它只是向Start方法組添加了一個重載(而不是覆蓋),但這在您的上下文中可能仍然有用。

您可能想要這樣的東西:

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

    thread.Start();
}

然后,您可以簡單地這樣稱呼它:

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

Thread類是密封的,但是這里是學習Threads好網站 另外,在這里查看Stackoverflow線程: 多線程參考?

我也習慣在Java應用程序中使用相同的邏輯,將線程捆綁到對象中然后將新進程的開始與其父進程進一步分開是很有意義的。 同樣,非常失望的C#不支持這種方法。 戴夫

沒有...

Thread類是密封的...

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

謝謝

不,這是一個密封的類,這意味着您不能從它繼承。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM