Excel互操作:Workbooks.Open挂起

时间:2012-01-30 13:26:27

标签: c# excel interop

这是对我之前的问题(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。

1 个答案:

答案 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方法的主要问题是它没有足够的响应能力让调用者了解这些原因。最好的方法是,在一个线程中执行此活动,并在某个时间执行线程。如果线程在指定的时间范围内没有响应,则失败。