Почитал 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)
|
В общем, проясните, пожалуйста ситуацию. Скажем, если есть метод долго обращающийся к БД, каким способом реализовать асинхронность? Спасибо. |