[英]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);
我也習慣在Java應用程序中使用相同的邏輯,將線程捆綁到對象中然后將新進程的開始與其父進程進一步分開是很有意義的。 同樣,非常失望的C#不支持這種方法。 戴夫
沒有...
Thread類是密封的...
[ComVisibleAttribute(true)]
[ClassInterfaceAttribute(ClassInterfaceType.None)]
public sealed class Thread : CriticalFinalizerObject,
_Thread
謝謝
不,這是一個密封的類,這意味着您不能從它繼承。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.