如何使用Dispatcher ?BeginInvoke正常
本文关键字:BeginInvoke 正常 Dispatcher 何使用 | 更新日期: 2023-09-27 18:08:40
我在网上几乎到处都找过了,我谷歌了很多次,找到了很多结果,但我仍然找不到解决我问题的方法。
我正忙着将旧的WinForms
应用程序转换为新的WPF应用程序,但我在一些命令方面遇到了麻烦。在Winforms应用程序中,他们使用Control.BeginInvoke()
并将其存储在IAsyncResult对象中。我读到Dispatcher.BeginInvoke()
是WPF
相当于WinForms
的Control.BeginInvoke()
,但当我使用
Dispatcher.BeginInvoke(): "不能隐式转换类型"System.Windows.Threading。DispatcherOperation'到'System.IAsyncResult'。存在显式转换(您是否缺少强制类型转换?)"。
任何帮助都将不胜感激。
这是我试图转换的代码。这是原始的WinForms
代码。我可以转换除了BeginInvoke部分以外的所有内容。
private eSkan.api.TeSkanAPI feSkanAPI = null;
private void MessageFilter_AddRemove_Invoked(bool AddFilter, IMessageFilter Filter)
{
if (AddFilter){ Application.AddMessageFilter(Filter); }
else { Application.RemoveMessageFilter(Filter); }
}
private void MessageFilter_AddRemove(bool AddFilter, IMessageFilter Filter)
{
{
IAsyncResult sr = BeginInvoke((ESKAN_ADD_REMOVE_MESSAGEFILTER)MessageFilter_AddRemove_Invoked,
AddFilter, Filter);
sr.AsyncWaitHandle.WaitOne(2000);
}
}
下面是我的代码,我已经转换到目前为止,包括BeginInvoke部分,我正在努力。
private void MessageFilter_AddRemove_Invoked(bool addFilter, System.Windows.Forms.IMessageFilter filter)
{
if (addFilter)
{
System.Windows.Forms.Application.AddMessageFilter(filter);
}
else
{
System.Windows.Forms.Application.RemoveMessageFilter(filter);
}
}
private void MessageFilter_AddRemove(bool addFilter, System.Windows.Forms.IMessageFilter filter)
{
{
IAsyncResult sr = System.Windows.Threading.Dispatcher.BeginInvoke((ESKAN_ADD_REMOVE_MESSAGEFILTER)MessageFilter_AddRemove_Invoked, addFilter, filter);
sr.AsyncWaitHandle.WaitOne(2000);
}
}
如果还有其他错误,请告诉我。
谢谢
这是因为虽然Dispatcher.BeginInvoke
可能是等效的逻辑操作,但它不返回IAsyncResult
,而是返回DispatcherOperation
。看看这篇博文,你会看到Dispatcher
如何工作的一个很好的例子。我已经复制了相关的代码示例到这里,以确保它以后存在。
public Window1()
{
InitializeComponent();
CheckBox myCheckBox = new CheckBox();
myCheckBox.Content = "A Checkbox";
System.Threading.Thread thread = new System.Threading.Thread(
new System.Threading.ThreadStart(
delegate()
{
System.Windows.Threading.DispatcherOperation
dispatcherOp = myCheckBox.Dispatcher.BeginInvoke(
System.Windows.Threading.DispatcherPriority.Normal,
new Action(
delegate()
{
myCheckBox.IsChecked = true;
}
));
dispatcherOp.Completed += new EventHandler(dispatcherOp_Completed);
}
));
thread.Start();
}
void dispatcherOp_Completed(object sender, EventArgs e)
{
Console.WriteLine("The checkbox has finished being updated!");
}
注意这一行:
dispatcherOp.Completed += new EventHandler(dispatcherOp_Completed);
这样你就知道它什么时候完成了——它会通过那个事件回叫你