Dispatcher.BeginInvoke中的Delegate引用基类虚方法

时间:2013-10-08 11:38:16

标签: wpf c#-4.0

我陷入了如下情况。

我试图使用委托从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();
  }
}

1 个答案:

答案 0 :(得分: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();

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

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