[英]How do I use Dispatcher.BeginInvoke properly?
我幾乎到處搜索互聯網,我搜索了很多次,發現了很多結果,但我仍然無法找到問題的解決方案。
我正忙着將舊的WinForms
應用程序轉換為新的WPF應用程序,但我遇到了一些命令問題。 在Winforms應用程序中,它們使用Control.BeginInvoke()
並將其存儲在IAsyncResult對象中。 我已經讀過Dispatcher.BeginInvoke()
是與WinForms
的Control.BeginInvoke()
相當的WPF
但我在使用時遇到此錯誤
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);
這就是你知道它何時完成的方式 - 它將通過該事件回電給你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.