我几乎到处搜索互联网,我搜索了很多次,发现了很多结果,但我仍然无法找到解决问题的方法。
我正忙着将旧的WinForms
应用程序转换为新的WPF应用程序,但我遇到了一些命令问题。在Winforms应用程序中,他们使用Control.BeginInvoke()
并将其存储在IAsyncResult对象中。我已经读过,Dispatcher.BeginInvoke()
与WPF
相当Control.BeginInvoke()
WinForms
,但是当我使用
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);
}
}
如果有任何其他错误,请告诉我。
由于
答案 0 :(得分:4)
那是因为Dispatcher.BeginInvoke
虽然可能是等效的逻辑操作,却不返回IAsyncResult
,但它会返回DispatcherOperation
。看看this blog post,您会看到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);
这就是你知道它何时完成的方式 - 它将通过该事件回电给你。