Excel interop:工作簿。打开挂起

这是继续我以前的问题( 打开Excel工作簿与VBA代码 – 错误通知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对象。 它也试图避免创buildExcel对象的多个实例。 下面的代码使用这个返回的对象

 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悬挂的一个可能的原因是文件共享。 防病毒扫描程序可能会获得对文件的独占locking,而当时我的应用程序正在尝试打开时挂起。 问题是这是一个随机的行为,我真的很难复制这个。另一个问题是我必须find一个出路与互操作只。

我发现这个问题。 以下是悬挂的原因:

1)我正在通过networking打开工作簿。

 Workbook workBook = workBooks.Open(file, 0, true, 5, "", "", true, XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); 

文件不在我的本地机器上。 将文件复制到本地计算机并打开后,挂起的案件数减less了。

2)服务器内存。 挂起的另一个原因是,服务器的CPU使用率是100%。不在我的控制之下。 但是,我很满意,我find了这个。

Open方法的主要问题是它没有足够的响应来让调用者知道这些原因。 最好的方法是,在一个线程中执行这个活动,并让线程有时间执行。 如果线程在指定的时间范围内没有响应,则失败。