C# 继承问题

C# 继承问题,c#,winforms,inheritance,C#,Winforms,Inheritance,我创建了一个类: public class AbortableBackgroundWorker : BackgroundWorker { private Thread workerThread; protected override void OnDoWork(DoWorkEventArgs e) { workerThread = Thread.CurrentThread; try { base.

我创建了一个类:

public class AbortableBackgroundWorker : BackgroundWorker
{



  private Thread workerThread;

    protected override void OnDoWork(DoWorkEventArgs e)
    {
        workerThread = Thread.CurrentThread;
        try
        {
            base.OnDoWork(e);
        }
        catch (ThreadAbortException)
        {
            e.Cancel = true; //We must set Cancel property to true!
            Thread.ResetAbort(); //Prevents ThreadAbortException propagation
        }
    }


    public void Abort()
    {
        if (workerThread != null)
        {
            workerThread.Abort();
            workerThread = null;
        }
    }
}
以下是我如何使用它:

  backgroundWorker1 = new AbortableBackgroundWorker();
//...
backgroundWorker1.RunWorkerAsync();

if (backgroundWorker1.IsBusy == true)
{
    backgroundWorker1.Abort();//This method is unavailable :(
    backgroundWorker1.Dispose();
}

另一个小问题..此代码是否会取消backgroundworker?

此方法不可用,因为backgroundWorker1的静态类型是backgroundworker。你需要

AbortableBackgroundWorker backgroundWorker1 = new AbortableBackgroundWorker();

否则,您将不得不使用cast或as AbortableBackgroundWorker向下转换该方法不可用,因为backgroundWorker1的静态类型是BackgroundWorker。你需要

AbortableBackgroundWorker backgroundWorker1 = new AbortableBackgroundWorker();

否则,您将不得不对其进行向下转换,无论是使用cast还是AbortableBackgroundWorker,这都不是中止BackgroundWorker任务的正确方法。。。请改用方法和属性。您几乎不应该中止线程,至少当您可以干净地退出此线程时是如此。

中止BackgroundWorker任务不是正确的方法。。。请改用方法和属性。您几乎不应该中止线程,至少当您可以干净地退出此线程时是这样。

为什么您从BackgroundWorker继承并创建自己的线程?您创建的AbortableBackgroundWorker是什么类型的?看起来您可能正在以BackgroundWorker类型创建它。我正在寻找一种中止它的方法!!为什么您从BackgroundWorker继承并创建自己的线程?您创建的AbortableBackgroundWorker是什么类型的?看起来您可能正在以BackgroundWorker类型创建它。我正在寻找一种中止它的方法@Dmitry:IsBusy应该是可用的。。。这是一个公共bool只读属性,因此它被成功继承。请回答我的第二个问题,上面的代码是否会成功中止backgroundworker@DmitryMakovetskiyd-所有可中止的BackgroundWorker是一个BackgroundWorker。并非所有BackgroundWorker都是AbortableBackgroundWorker,您的代码只会中止AbortableBackgroundWorker。当然,这并不能解决整个设计都有缺陷这一事实,如果你真的使用它,那将是一个傻瓜。@Dmitry:IsBusy应该是可用的。。。这是一个公共bool只读属性,因此它被成功继承。请回答我的第二个问题,上面的代码是否会成功中止backgroundworker@DmitryMakovetskiyd-所有可中止的BackgroundWorker是一个BackgroundWorker。并非所有BackgroundWorker都是AbortableBackgroundWorker,您的代码只会中止AbortableBackgroundWorker。当然,这并不能解决整个设计都有缺陷的问题,如果你真的使用它,那将是一个傻瓜。