这是对我之前的问题(Open Excel Workbook with vba code - error to notify VSTO)的继续,这个问题尚待解决。我对Excel Interop有一套新的问题。 即使excel文件中没有任何错误,我也看到workBooks.Open 有时无限期挂起,从而导致我的应用程序永远挂起。我使用以下代码初始化excel对象
public static class InterOpService
{
private static Application _excel;
public static Application Excel
{
get
{
try
{
_excel = (Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
_excel.Visible = true;
}
catch(Exception ex)
{
_excel = new Application { Visible = true };
}
return _excel;
}
}
}
上面的代码返回一个Excel对象。它还尝试避免创建Excel对象的多个实例。以下代码使用此返回的对象
Application excel = InterOpService.Excel;
Workbooks workBooks = excel.Workbooks;
string file = fileName;
Workbook workBook = workBooks.Open(file, 0,
true,
5,
"",
"",
true,
XlPlatform.xlWindows,
"\t",
false,
false,
0,
true,
1,
0);
我看到挂起workbooks.open的一个可能原因是文件共享。可能是防病毒扫描程序正在获取文件的独占锁定,而我的应用程序在此时尝试打开时挂起。问题是这是一个随机行为,我真的很难复制这个。另一个问题是我必须找到一个解决方案只有Interop。
答案 0 :(得分:1)
我发现了这个问题。 以下是悬挂的原因:
1)我正在通过网络打开工作簿。
Workbook workBook = workBooks.Open(file, 0,
true,
5,
"",
"",
true,
XlPlatform.xlWindows,
"\t",
false,
false,
0,
true,
1,
0);
文件不在我的本地计算机中。将文件复制到本地计算机并打开后,挂起的案例数减少了。
2)服务器内存。 挂起的另一个原因是服务器中的CPU使用率为100%。不在我的控制范围内。但我很满意,我把它追了下来。
Open方法的主要问题是它没有足够的响应能力让调用者了解这些原因。最好的方法是,在一个线程中执行此活动,并在某个时间执行线程。如果线程在指定的时间范围内没有响应,则失败。