簡體   English   中英

C#.Net CF Form.Invoke引發ArgumentException

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM