Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка под ASP.NET > синхронные службы и вызовы


Автор: nvb 14.12.2012, 12:28
Почитал msdn и Matthew MacDonald и возник следующий вопрос.
В чем разница, между созданием асинхронных методов веб-службы и асинхронным вызовом синхронного метода веб-службы с помощью делегатов и с помощью прокси класса? Чтоб было понятно, о чем вопрос, приведу код всех трех способов:

1) Определяем асинхронные методы веб-службы.
Код


public class MyService : WebService 
{
    public RemoteService remoteService;
    public MyService() 
    {
        // Create a new instance of proxy class for 
        // the Web service to be called.
        remoteService = new RemoteService();
    }
    // Define the Begin method.
    [WebMethod]
    public IAsyncResult BeginGetAuthorRoyalties(String Author,
        AsyncCallback callback, object asyncState) 
    {
        // Begin asynchronous communictation with a different XML Web
        // service.
        return remoteService.BeginReturnedStronglyTypedDS(Author,
            callback,asyncState);
    }
    // Define the End method.
    [WebMethod]
    public AuthorRoyalties EndGetAuthorRoyalties(IAsyncResult
        asyncResult) 
    {
        // Return the asynchronous result from the other Web service.
        return remoteService.EndReturnedStronglyTypedDS(asyncResult);
    }
}


2) Вызываем синхронные методы с помощью асинхронных делегатов
Код

protected void cmdAsynchronous_Click(object sender, System.EventArgs e)
{
// Записываем время начала.
DateTime startTime = DateTime.Now;
// Запускаем Web-службу в другом потоке.
EmployeesService proxy = new EmployeesService();
GetEmployeesDelegate async = new GetEmployeesDelegate(proxy.GetEmployees);
IAsyncResult handle = async.BeginInvoke(null, null);
// Выполняем какие-то другие длительные по времени задачи.
DoSomethingSlow();
// Извлекаем результат. Если он еще не готов, ожидаем.
try
{
 GridView1.DataSource = async.EndInvoke(handle);
}
catch (Exception err)
{
 lblInfo.Text = "Problem contacting web service.";
 return;
}
GridView1.DataBind();
// Определяем общее количество затраченного времени.
TimeSpan timeTaken = DateTime.Now.Subtract(startTime);
lblInfo.Text = "Asynchronous operations took " + timeTaken.TotalSeconds +
" seconds.";
}


3) Вместо делегатов используем прокси класс

Код

public long[] Factorize(long factorizableNum)
public System.IAsyncResult BeginFactorize(long factorizableNum, System.AsyncCallback callback, object asyncState)
public long[] EndFactorize(System.IAsyncResult asyncResult)


В общем, проясните, пожалуйста ситуацию. Скажем, если есть метод долго обращающийся к БД, каким способом реализовать асинхронность?
Спасибо. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)