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 = ...
}