[英]c# .Net CF Form.Invoke raise ArgumentException
我正在從以下代碼中獲取ArgumentException,我正在努力理解它,堆棧跟蹤中的最后一項是
System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr,
Binder binder, Object[] parameters, CultureInfo culture,
Boolean verifyAccess, StackCrawlMark& stackMark)
當我逐步執行DeviceResponse時,將按我的預期進行填充,並且按預期方式定位了目標,但是targetForm.Invoke每次都會拋出
任何幫助將非常感激。
該事件定義為:
public static event EventHandler<MsgEventArgs<DeviceResponse>> DeviceResponseReceived;
該事件從以下代碼引發:
//Raise the event
if (DeviceResponseReceived != null)
{
if (DeviceResponseReceived.Target is System.Windows.Forms.Form)
{
System.Windows.Forms.Form targetForm = DeviceResponseReceived.Target as System.Windows.Forms.Form;
targetForm.Invoke(DeviceResponseReceived, new MsgEventArgs<DeviceResponse>(deviceResponse));
}
}
MsgEventArgs是從EventArgs派生的通用事件參數類:
public class MsgEventArgs<T> : EventArgs
{
public MsgEventArgs(T value)
{
m_value = value;
}
private T m_value;
public T Value
{
get { return m_value; }
}
}
在我的表單中,我已經在表單構造函數中注冊了該事件:
DeviceResponse.DeviceResponseReceived += new EventHandler<MIASmartClient.Messaging.Transport.MsgEventArgs<DeviceResponse>>(DeviceResponse_DeviceResponseReceived);
與實現為:
void DeviceResponse_DeviceResponseReceived(object sender, MIASmartClient.Messaging.Transport.MsgEventArgs<DeviceResponse> e)
{
_presenter.DeviceResponseReceived(e.Value);
}
感謝您抽出寶貴時間來看看
從有關事件的Msdn文章中:
事件是一種特殊的多播委托,只能在聲明它們的類或結構(發布者類)中調用。
這是有道理的。 聲明事件的類(發布者)應該是唯一確定何時何地引發事件的類。 這也是為什么事件僅向客戶端代碼(訂戶)公開某些操作的原因,例如訂閱和取消訂閱。
在您的代碼中,您將DeviceResponseReceived事件作為targetForm.Invoke中的委托參數傳遞,並期望由目標(Form)調用。 目標不在聲明事件的位置,因此是異常。
您要確保DeviceResponse_DeviceResponseReceived事件處理程序在UI線程上執行,因為它正好接觸UI組件。 然后在那里可以檢查InvokeRequired是否 。 有關如何從其他線程更新UI的更多信息,請參見WinForms UI線程調用 。
在沒有嘗試代碼的情況下,以下代碼使我感到奇怪:
if (DeviceResponseReceived != null)
{
if (DeviceResponseReceived.Target is System.Windows.Forms.Form)
{
System.Windows.Forms.Form targetForm = DeviceResponseReceived.Target as System.Windows.Forms.Form;
targetForm.Invoke(DeviceResponseReceived, new MsgEventArgs<DeviceResponse>(deviceResponse));
}
}
您檢查是否已分配DeviceResponseReceived
委托(我想是嗎?),然后告訴targetForm
調用該委托。 代表實際指向哪里? 我猜想您真正想做的是在targetForm
調用相應的方法?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.