Поделиться через


Асинхронный вызов метода CloseWorkbook

Дата последнего изменения: 24 марта 2010 г.

Применимо к: SharePoint Server 2010

При работе с веб-службами Excel по окончании сеанса рекомендуется закрыть рабочую книгу, вызвав метод CloseWorkbook. При этом будет закрыт сеанс служб Excel и планово высвобождаются соответствующие ресурсы. Такой подход может повысить производительность и надежность сервера.

Однако любой вызов веб-службы занимает определенное время. В зависимости от типа установки сервера, способа доступа к нему и нагрузки на сервер вызов может занимать от 50 до 500 мс. Кроме того, вызов веб-службы может занимать значительно большее время в периоды максимальной нагрузки на сервер.

Поскольку выполнение каких-либо действий с завершившимся сбоем методом CloseWorkbook не поддерживается, не требуется дожидаться его завершения и проверять успешность выполнения. В связи с этим метод можно вызывать асинхронно, что позволяет сэкономить время для других операций.

ПримечаниеПримечание

Если в приложении осуществляется вызов некоторых методов служб Excel с последующим завершением работы, можно закрыть книгу синхронным способом вместо асинхронного. В этом случае следует вызвать метод CloseWorkbook вместо метода CloseWorkbookAsync. Такой подход может применяться, поскольку при выходе из процесса непосредственно после выполнения асинхронного вызова существует вероятность неудачного завершения вызова.

Для асинхронного закрытия рабочей книги выполните следующие действия:

  • Убедитесь, что прокси-класс веб-служб Excel не ликвидируется. В противном случае возможно возникновение исключений, не относящихся к службам Excel.

  • Вызовите метод CloseWorkbookAsync вместо метода CloseWorkbook. Метод CloseWorkbookAsync имеет следующую сигнатуру:

    public void CloseWorkbookAsync(string sessionId)
    
    Public Sub CloseWorkbookAsync(ByVal sessionId As String)
    End Sub
    

Реализовывать событие, вызываемое при вызове метода CloseWorkbookAsync, не требуется.

Сигнатура метода приведена в файле "Reference.cs" в каталоге "Веб-ссылки" проекта.

ПримечаниеПримечание

Метод CloseWorkbookAsync располагается в прокси-классе, который создается при добавлении веб-ссылки в Microsoft Visual Studio 2005. При работе в Visual Studio 2003 для асинхронного закрытия рабочей книги следует вызвать метод BeginCloseWorkbook.

При вызове метода CloseWorkbookAsync или BeginCloseWorkbook рабочая книга закрывается асинхронно с минимальными затратами времени приложения.

Пример

В следующем примере показан порядок асинхронного закрытия рабочей книги в Visual Studio 2005.

using System;
using SampleApplication.ExcelWebService;
using System.Web.Services.Protocols;
namespace SampleApplication
{
    class Class1
    {
        [STAThread]
        static void Main(string[] args)
        {            
            // Instantiate the Web service 
            // and create a status array object.
            ExcelService es = new ExcelService();
            Status[] outStatus;

            string sheetName = "Sheet1";
            // TODO: change the workbook path to 
            // point to workbook in a trusted location
            // that you have access to. 
            string targetWorkbookPath = 
             "http://myserver02/example/Shared%20Documents/Book1.xlsx";

            // Set credentials for requests.
            es.Credentials = 
                System.Net.CredentialCache.DefaultCredentials;
            
            try
            {
                // Call open workbook, and point to the trusted   
                // location of the workbook to open.
                string sessionId = es.OpenWorkbook(targetWorkbookPath, 
                    "en-US", "en-US", out outStatus);
                // Call the GetCell method 
                // to retrieve a value from a cell.
                // The cell is in the first row and ninth column.
                object[] rangeResult2 = xlservice.GetCell(sessionId, 
                    sheetName, 0, 8, false, out outStatus);
 
                // Close the workbook asynchronously. 
                // This also closes session.
                es.CloseWorkbookAsync(sessionId);
            }
            catch (SoapException e)
            {
                Console.WriteLine("SOAP Exception Message: {0}", 
                   e.Message);
                Console.WriteLine("SOAP Exception Error Code: {0}", 
                   e.SubCode.Code.Name);
            }
            catch (Exception e)
            {
                Console.WriteLine("Exception Message: {0}", e.Message);
            }
            // Console.ReadLine();
        }
    }
}
 
Imports System
Imports SampleApplication.ExcelWebService
Imports System.Web.Services.Protocols
Namespace SampleApplication
    Friend Class Class1
        <STAThread> _
        Shared Sub Main(ByVal args() As String)
            ' Instantiate the Web service 
            ' and create a status array object.
            Dim es As New ExcelService()
            Dim outStatus() As Status

            Dim sheetName As String = "Sheet1"
            ' TODO: change the workbook path to 
            ' point to workbook in a trusted location
            ' that you have access to. 
            Dim targetWorkbookPath As String = "http://myserver02/example/Shared%20Documents/Book1.xlsx"

            ' Set credentials for requests.
            es.Credentials = System.Net.CredentialCache.DefaultCredentials

            Try
                ' Call open workbook, and point to the trusted   
                ' location of the workbook to open.
                Dim sessionId As String = es.OpenWorkbook(targetWorkbookPath, "en-US", "en-US", outStatus)
                ' Call the GetCell method 
                ' to retrieve a value from a cell.
                ' The cell is in the first row and ninth column.
                Dim rangeResult2() As Object = xlservice.GetCell(sessionId, sheetName, 0, 8, False, outStatus)

                ' Close the workbook asynchronously. 
                ' This also closes session.
                es.CloseWorkbookAsync(sessionId)
            Catch e As SoapException
                Console.WriteLine("SOAP Exception Message: {0}", e.Message)
                Console.WriteLine("SOAP Exception Error Code: {0}", e.SubCode.Code.Name)
            Catch e As Exception
                Console.WriteLine("Exception Message: {0}", e.Message)
            End Try
            ' Console.ReadLine();
        End Sub
    End Class
End Namespace

Надежное программирование

Убедитесь, что добавлена веб-ссылка на доступный сайт веб-служб Excel. Измените выражение using SampleApplication.ExcelWebService;таким образом, чтобы оно указывало на соответствующий сайт веб-службы.

Кроме того, при необходимости измените путь к рабочей книге, имя листа и т. д.

См. также

Задачи

Пошаговое руководство. Разработка настраиваемого приложения с помощью веб-служб Excel

Практическое руководство. Перехват исключений

Инструкции по определению надежного расположения

Практическое руководство. Сохранение из клиента Excel на сервер

Использование свойства SubCode для получения кодов ошибок

Концепции

Доступ к API-интерфейсу SOAP

Excel Services Alerts

Известные проблемы и советы по работе со службами Excel

Вызовы SOAP с замыканием на себя и прямая привязка