Wpf Dispatcher.BeginInvoke中的委托引用基类虚拟方法

Wpf Dispatcher.BeginInvoke中的委托引用基类虚拟方法,wpf,c#-4.0,Wpf,C# 4.0,我陷入了如下的困境 我正在尝试使用委托从Dispatcher.BeginInvoke调用派生类重写函数。但是委托总是调用基类虚方法,而不是派生类重写方法 如何解决这个问题 下面是我的伪代码: class BaseClass { public BaseClass() { } public virtual void DoWork(int i) { //do nothing } } class DerivedClass : BaseClass {

我陷入了如下的困境

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

我怀疑这根本不是在呼唤什么。 因为您的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();
    }
}
然后按预期工作,打印橙色0


由于某些原因,它仅在使用Wait或BeginInvoke被Invoke替换时执行代码。

在new DoWork中。。。DoWork是否为委托类型?刚刚更新。。请再次查看。BeginInvoke是否应为方法、优先级和参数?为了清楚起见,您使用的是System.Windows.Threading.Dispatcher,对吗?是的…它是System.Windows.Threading.Dispatcher,并且使用下面的类型BeginInvokeDispatcherPriority、Delegate和Object
Dispatcher.CurrentDispatcher.BeginInvoke(new DoWork(obj.DoWork), DispatcherPriority.Normal, i).Wait();