COMException в основной ветке приложения WPF - PullRequest
0 голосов
/ 19 декабря 2011

WPF, Excel AddIn, C #, У меня есть несколько асинхронных вызовов для получения данных из веб-службы в главном потоке, а затем в обратном вызове, Я буду наносить данные в Excel. Я отслеживал обратный звонок, и они тоже запускаются в главном потоке. но я все еще получаю COMException 0x800AC472, гуглил и кажется, что это многопоточная проблема.

но я запутался, почему это произошло. Я думаю, что есть только один основной поток, и так как все обратные вызовы выполняются в основном потоке, и нет никаких причин для исключения?

Edit: В главном потоке пользовательского интерфейса нажимается лента / кнопка, она вызывает веб-сервис BuildMetaData, как только он возвращается обратно, в своем обратном вызове MetaDataCompleteCallback отправляется другой вызов веб-службы Как только он возвращается обратно, в своем обратном вызове DataRequestJobFinished он будет вызывать plot для вывода данных в Excel. см. ниже

On Main UI class:
Btn_Click()
{
...
                       _reportObjs[index].GenerateReport();

}

в классе для создания отчета

public void GenerateReport()
{
                Request.ParseFunction();
                Request.MetacompleteCallBack = MetaDataCompleteCallback;
                Request.BuildMetaData();
}

public void MetaDataCompleteCallback(int id)
{
            try
            {
                if (Request.IsRequestCancelled)
                {
                    Request.FormulaCell.Dispose();
                    return;
                }

                ErrorMessage = Request.ErrorMessage;
                if (string.IsNullOrEmpty(Request.ErrorMessage))
                {
                    _queryJob = new DataQueryJob(UnityContainer, Request.BuildQueryString(), DataRequestJobFinished, Request);
                }
                else
                {
                    ModifyCommentOnFormulaCellPublishRefreshEvent();
                }
            }
            catch (Exception ex)
            {
                ErrorMessage = ex.Message;
                ModifyCommentOnFormulaCellPublishRefreshEvent();
            }
            finally
            {
                Request.MetacompleteCallBack = null;
            }
} 


        public void DataRequestJobFinished(DataRequestResponse response)
        {
            Dispatcher.Invoke(new Action<DataRequestResponse>(DataRequestJobFinishedUI), response);
        }

        public void DataRequestJobFinished(DataRequestResponse response)
        {
            try
            {
                if (Request.IsRequestCancelled)
                {
                    return;
                }

                if (response.status != Status.COMPLETE)
                {
                    ErrorMessage = ManipulateStatusMsg(response);
                }
                else // COMPLETE
                {
                    // TODO: Convert this into factory pattern
                    var tmpReq = Request as DataRequest;
                    if (tmpReq == null) return;

                    new VerticalTemplate(tmpReq, response, IsOffice2003).Plot();

                }
            }
            catch (Exception e)
            {
                ErrorMessage = e.Message;
                MIMICShared.Helper.LogError(e);
            }
            finally
            {
                //if (token != null)
                //    this.UnityContainer.Resolve<IEventAggregator>().GetEvent<DataQueryJobComplete>().Unsubscribe(token);
                ModifyCommentOnFormulaCellPublishRefreshEvent();
                Request.FormulaCell.Dispose();
            }
        }


        on plot class

        public void Plot()
        {
        ... 
           attributeRange.Value2 = headerArray;
           DataRange.Value2 = ....
           DataRange.NumberFormat = ... 
        }

1 Ответ

0 голосов
/ 14 апреля 2012

Я видел этот стек / повтор. Этот пост рассказывает о том, как проверить, находится ли Excel в редактировании. http://www.add -in-express.com / создание-надстройки-блог / 2011/03/23 / первенствует проверки пользователь-редактировать-клетка /

...