Пустая ссылка исключение при вызове метода подключения к событию, вызванного WCF - PullRequest
1 голос
/ 02 декабря 2010

Пожалуйста, помогите мне.Я застрял в одной ситуации с WCF.Я работаю над клиент-серверным приложением, где сервер предоставляет свои сервисы через дуплексный канал WCF.Весь механизм построен как шаблон Pub-Sub.Сервер выполняет удаленный метод в каждом подключенном к нему клиентском прокси и отправляет обновленную сущность в качестве аргумента.Клиентский прокси вызывает событие UpdateEntityEvent.Каждый клиентский модуль подписывается на это событие с помощью метода UpdateData (Entity ent), с помощью которого каждая часть программы получает новые или обновленные объекты.У меня никогда не было таких проблем до сих пор, когда я получил такое исключение в одном из модулей, чтобы быть более конкретным, ситуация не повторяется каждым клиентом.Однажды это произошло на одной клиентской станции для конкретного пользователя, у которого (если это имеет смысл) есть ноутбук с процессором i3, когда другие клиенты работают на «более слабых» машинах.Это ошибка:

<log4j:event logger="Client Application" timestamp="1291132669957" level="INFO" thread="WCF Layer"><log4j:message>User has started application and logged in with success.</log4j:message>
    <log4j:event logger="Client Application" timestamp="1291133884092" level="FATAL" thread="11"><log4j:message>Type: 
    Source: 
    System.Windows.Forms
    Method: 
    System.Object MarshaledInvoke(System.Windows.Forms.Control, System.Delegate, System.Object[], Boolean)
    Mesage: 
    Object reference not set to instance of an object.
    StackTrace: 
       w System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous)
       w System.Windows.Forms.Control.Invoke(Delegate method, Object[] args)
       w ClientApplication.Controls.RampDashboard.MyTasksControl.UpdateData(Entity entity)
       w ClientDataProvider.DataProvider.UpdateEntityHandler.Invoke(Entity value)
       w ClientDataProvider.DataProvider.UpdateEntityThread(Object obj) w C:\SomeDir\SomeFile.cs:row 380
       w System.Threading._ThreadPoolWaitCallback.WaitCallback_Context(Object state)
       w System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       w System.Threading._ThreadPoolWaitCallback.PerformWaitCallbackInternal(_ThreadPoolWaitCallback tpWaitCallBack)
       w System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(Object state)
    InnerException: 

    <log4j:throwable>System.NullReferenceException: Object reference not set to instance of an object.
       w System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous)
       w System.Windows.Forms.Control.Invoke(Delegate method, Object[] args)
       w ClientApplication.Controls.RampDashboard.MyTasksControl.UpdateData(Entity entity)
       w ClientDataProvider.DataProvider.UpdateEntityHandler.Invoke(Entity value)
       w ClientDataProvider.DataProvider.UpdateEntityThread(Object obj) w C:\SomeDir\SomeFile.cs:row 380
       w System.Threading._ThreadPoolWaitCallback.WaitCallback_Context(Object state)
       w System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       w System.Threading._ThreadPoolWaitCallback.PerformWaitCallbackInternal(_ThreadPoolWaitCallback tpWaitCallBack)
       w System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(Object state)</log4j:throwable><log4j:locationInfo class="ClientApplication.Program" method="CurrentDomainUnhandledException" file="" line="0" /></log4j:event>

Метод UpdateData () выглядит следующим образом:

private delegate void UpdateDataHandleDelegate(Entity entity);
    /// <summary>
    /// Updates the data.
    /// </summary>
    /// <param name="entity">The entity.</param>
    private void UpdateData(Entity entity)
    {
        if (InvokeRequired)
        {
            Invoke(new UpdateDataHandleDelegate(UpdateData), entity);
        }
        else
        {
               // business logic here
        }
    }

Дополнительная информация о том, что объектный объект, который элемент управления получает через UpdateData, предоставляет некоторые данные, которыеиспользуется для заполнения коммерческого элемента управления Spreadsheet.Мой вопрос: что вызывает эту ошибку, NULL в объекте Entity, переданный в UpdateData, или это проблема Invoke.Если так, то как получается, что у него есть ссылка NULL в Invoke, когда UpdateData подписан на событие Update ранее, и у него никогда не будет шанса быть запущенным иначе, чем через процедуру подписки, которая вызывается в конструкторе элемента управления задолго после InitializeComponent ??Что здесь NULL, если это быловнутри объекта Entity ошибка не была бы более конкретной ??

Спасибо за любые идеи

...