Wpf Dispatcher.BeginInvoke中的委托引用基类虚拟方法
我陷入了如下的困境 我正在尝试使用委托从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 {
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();