我有一个应用程序可以自动执行一些与文件相关的作业。每个作业都在不同的线程中执行。一种工作是将Excel文件导出为HTML格式。为此我使用Microsoft.Office.Interop.Excel
命名空间。我的应用程序在Windows Server 2008环境下工作正常,但我们将服务器升级到Windows Server 2012,并开始出现以下错误:在多线程C#应用程序中使用互操作的Excel文件操作失败
消息过滤器指示应用程序正忙。 (异常来自HRESULT:0x8001010A(RPC_E_SERVERCALL_RETRYLATER))
事情是导出函数第一次调用成功出口Excel文件HTML,但后续的调用失败,出现上述错误。我确保关闭并最终确定所有与Excel相关的对象,并从任务管理器中检查excel.exe是否无效,但没有运气。
我用下面的代码,如果发生这个错误,但它不断变得异常和试5次后
while (!success)
{
try
{
ExportExcel();
success = true;
System.Threading.Thread.Sleep(2000);
}
catch (System.Runtime.InteropServices.COMException loE)
{
tryCount++;
if (loE.HResult.ToString("X") == "80010001" || loE.HResult.ToString("X") == "8001010A" && tryCount<5)
{
System.Threading.Thread.Sleep(2000);
}
else
{
throw;
}
}
}
我怀疑这可能是一个相关的一些线程错误,但我不能拿出未能重试与一个答案。任何见解都会有所帮助。
谢谢乔指出正确的方式:
我结束了使用具有以下链接的混合的解决方案: http://blogs.artinsoft.net/Mrojas/archive/2012/09/28/Office-Interop-and-Call-was-rejected-by-callee.aspx
http://blogs.msdn.com/b/pfxteam/archive/2010/04/07/9990421.aspx
所以我用类似如下:
StaTaskScheduler cts=new StaTaskScheduler(1);
TaskFactory factory;
factory = new TaskFactory(cts);
Task jobRunTask = factory.StartNew(() =>
{
MessageFilter.Register();
ExcelInteropFunction();
MessageFilter.Revove();
});
我使用重试逻辑重试5次,如果发生此错误,但它没有帮助,我不断收到错误。 – erdem
正如我所说,我认为你应该实现一个IMessageFilter(Ole消息过滤器),而不是捕获异常并重试。查看更新。 – Joe
你能举一个例子说明如何在代码中使用它。 我以自动方式创建我的线程,我不知道下一个将要处理的工作是否与excel相关,因此我认为我无法使用此接口注册所有线程,是否可以在内部调用它一个任务,就在excel导出函数调用之前? – erdem