我有一个应用程序,会多次写入带有公式/宏的工作簿。它循环遍历一些数据3次,每次迭代都会创建、填充、保存,然后关闭Excel文件。当它是唯一的运行版本时,它可以正常工作,但如果有多个实例运行,就会出现问题。
具体来说,在向某些单元格写入数据时,我会遇到0x800AC472错误。每次出错时,它不是相同的单元格或值,但似乎每次都在第二次遍历时发生。这是相关代码:
我将_maxRetries设置为10,_threadSleepMs设置为500,但仍然出现错误,所以我认为再增加没有意义了。
我想知道是否有其他方法可以让线程有机会“解除卡顿”。
也许这可以算作第二个问题,但我不太担心,当它崩溃时,我仍然在finally块中执行Close()操作,但我仍然有它的实例挂起。这是我的关闭方式:
具体来说,在向某些单元格写入数据时,我会遇到0x800AC472错误。每次出错时,它不是相同的单元格或值,但似乎每次都在第二次遍历时发生。这是相关代码:
public void SetCellValue(int row, int col, string val)
{
if (_currWorkSheet != null)
{
string parms = string.Format("row={0}; col={1}; val={2}", row.ToString(), col.ToString(), val);
for (short i = 0; i < _maxRetries; i++)
{
try { (_currWorkSheet.Cells[row, col] as Range).Value2 = val; return; }
catch (Exception ex) { HandleError(ex, parms); }
}
Exception newExc = new Exception("Too many retries attempting to set cell value.");
newExc.Data.Add("parms", parms);
throw newExc;
}
}
private void HandleError(Exception exc, string parms)
{
if (exc != null && exc.Message != null)
{
// Excel error that just needs more time to complete. http://social.msdn.microsoft.com/forums/en-US/vsto/thread/9168f9f2-e5bc-4535-8d7d-4e374ab8ff09/
if (exc.Message.Contains("0x800AC472"))
Thread.Sleep(_threadSleepMs); // Give excel a chance to catch up, then keep processing.
else
{
Exception newExc = new Exception("Unexpected Error", exc);
newExc.Data.Add("parms", parms);
throw newExc;
}
}
}
我将_maxRetries设置为10,_threadSleepMs设置为500,但仍然出现错误,所以我认为再增加没有意义了。
我想知道是否有其他方法可以让线程有机会“解除卡顿”。
也许这可以算作第二个问题,但我不太担心,当它崩溃时,我仍然在finally块中执行Close()操作,但我仍然有它的实例挂起。这是我的关闭方式:
public void Dispose()
{
if (!_disposed)
{
if (_currWorkBook != null)
for (short i = 0; i < _maxRetries; i++)
{
try { _currWorkBook.Close(false, _missing, _missing); break; }
catch (Exception ex) { HandleError(ex, ""); }
}
if (_app != null)
{
if (_app.Workbooks != null)
for (short i = 0; i < _maxRetries; i++)
{
try { _app.Workbooks.Close(); break; }
catch (Exception ex) { HandleError(ex, ""); }
}
for (short i = 0; i < _maxRetries; i++)
{
try { _app.Quit(); break; }
catch (Exception ex) { HandleError(ex, ""); }
}
if (_currWorkSheet != null)
{
Marshal.ReleaseComObject(_currWorkSheet);
_currWorkSheet = null;
}
if (_currWorkBook != null)
{
Marshal.ReleaseComObject(_currWorkBook);
_currWorkBook = null;
}
Marshal.ReleaseComObject(_app);
_app = null;
}
GC.Collect();
_disposed = true;
}
}
它没有抛出错误,所以我只是想知道是否存在任何漏洞?
谢谢, 杰夫