1

我陷入了如下情况。

我正在尝试使用委托从 Dispatcher.BeginInvoke 调用派生类重写函数。但是委托总是调用基类的虚方法而不是派生类的重写方法。

如何解决问题?

下面是我的伪代码:

class BaseClass
{
    public BaseClass() { }
    public virtual void DoWork(int i)
    {
        //do nothing

    }
}

class DerivedClass : BaseClass
{
    public DerivedClass() { }
    public override void DoWork(int i)
    {
        MessageBox.Show((i + 2).ToString());
    }
}
public delegate void delDoWork(int i);
class SomeClass
{
   private void SomeMethod()
   {
        oDerived = new DerivedClass();

        ThreadStart ts = delegate
        {
            Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Normal, 
            new delDoWork(oDerived.DoWork), i);
        };
        new Thread(ts).Start();
  }
}
4

1 回答 1

0

我怀疑它根本没有调用任何东西。因为您的 BaseClass.DoWork 是空的,所以您可能会误以为它正在调用那个。

考虑这段代码:

public class Fruit
{
    public virtual void DoWork(int i)
    {
        MessageBox.Show("Fruit " + i);
    }
}

public class Orange : Fruit
{
    public override void DoWork(int i)
    {
        MessageBox.Show("Orange " + i);
    }
}

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    delegate void DoWork(int i);

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        ThreadStart ts = delegate
        {
            var obj = new Orange();
            int i = 0;
            Dispatcher.CurrentDispatcher.BeginInvoke(new DoWork(obj.DoWork), DispatcherPriority.Normal, i);
        };
        new Thread(ts).Start();
    }
}

当我运行它并触发事件时,什么也没有发生。
但是我用这个替换了 BeginInvoke 行:

Dispatcher.CurrentDispatcher.BeginInvoke(new DoWork(obj.DoWork), DispatcherPriority.Normal, i).Wait();

然后它按预期工作(打印“Orange 0”)

出于某种原因,它仅在Wait使用时(或如果BeginInvoke被替换Invoke)执行代码。

于 2013-10-08T12:14:57.870 回答