我陷入了如下情况。
我试图使用委托从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();
}
}
答案 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
)。