我正在遍历数百个Excel文件的目录,并尝试逐个刷新Excel文件。但我一直收到这个错误,指示刷新操作仍在文件A上运行,例如FileB正在尝试开始一个刷新操作。循环速度太快了,我必须等待先前对文件A的刷新操作完成后才能开始刷新文件B。
未处理的异常:System.Runtime.InteropServices.COMException: 消息过滤器指示应用程序正在忙碌中。(HRESULT 为 0x8001010A (RPC_E_SERVERCALL_RETRYLATER)的异常) 在 Microsoft.Office.Interop.Excel._Workbook.RefreshAll(),在 RefreshExcelFiles.Program.RefreshFile(String fileName)
这是我的代码。如何在开始处理循环中的新文件之前等待刷新操作完成?或者,在wb对象上的marshal释放操作完成之前等待开始处理新文件?
未处理的异常:System.Runtime.InteropServices.COMException: 消息过滤器指示应用程序正在忙碌中。(HRESULT 为 0x8001010A (RPC_E_SERVERCALL_RETRYLATER)的异常) 在 Microsoft.Office.Interop.Excel._Workbook.RefreshAll(),在 RefreshExcelFiles.Program.RefreshFile(String fileName)
这是我的代码。如何在开始处理循环中的新文件之前等待刷新操作完成?或者,在wb对象上的marshal释放操作完成之前等待开始处理新文件?
using System;
using System.Configuration;
using System.IO;
using System.Runtime.InteropServices;
using Microsoft.Office.Interop.Excel;
namespace RefreshExcelFiles
{
internal class Program
{
private static string _fileDirectory;
private static Application _excelApp;
private static void Main(string[] args)
{
_fileDirectory = ConfigurationManager.AppSettings["FileDirectory"];
_excelApp = new Application();
_excelApp.DisplayAlerts = false;
Console.WriteLine("starting to refresh files");
int i = 0;
int total = Directory.GetFiles(_fileDirectory).Length;
foreach (string file in Directory.GetFiles(_fileDirectory))
{
i += 1;
Console.WriteLine("File " + file + " " + i.ToString() + "/" + total.ToString());
RefreshFile(file);
}
_excelApp.Quit();
Marshal.FinalReleaseComObject(_excelApp);
Console.WriteLine("press any key to exit");
Console.ReadLine();
}
private static void RefreshFile(string fileName)
{
_Workbook wb = _excelApp.Workbooks.Open(fileName, false);
wb.RefreshAll();
wb.Save();
wb.Close(Type.Missing, Type.Missing, Type.Missing);
Marshal.FinalReleaseComObject(wb);
}
}
}