Асинхронный вызов метода 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 для получения кодов ошибок