【发布时间】:2015-06-01 06:47:24
【问题描述】:
我有一个应用程序可以自动执行一些与文件相关的工作。每个作业都在单独的线程中执行。一种工作是将 Excel 文件导出为 HTML 格式。为此,我使用 Microsoft.Office.Interop.Excel 命名空间。我的应用程序在 Windows Server 2008 环境下运行良好,但我们将服务器升级到 Windows Server 2012,我开始收到以下错误:
消息过滤器指示应用程序正忙。 (来自 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();
});
【问题讨论】:
标签: c# .net multithreading interop export-to-excel