Gọi bất đồng bộ một phương thức web
Posted: 15/10/2009.
Bạn cần gọi một phương thức web trong một tiểu trình khác để chương trình của bạn có thể thực hiện các tác vụ khác trong khi chờ đáp ứng. Khi đó hãy sử dụng các phương thức bất đồng bộ có sẵn trong lớp proxy. Các phương thức này có tên là BeginXXX và EndXXX với XXX là tên của phương thức đồng bộ gốc.
Bạn cần gọi một phương thức web trong một tiểu trình khác để chương trình của bạn có thể thực hiện các tác vụ khác trong khi chờ đáp ứng. Khi đó hãy sử dụng các phương thức bất đồng bộ có sẵn trong lớp proxy. Các phương thức này có tên là BeginXXX và EndXXX với XXX là tên của phương thức đồng bộ gốc.
Lớp proxy (được tạo tự động) có các tính năng cơ bản mà bạn cần để gọi bất kỳ phương thức web nào một cách bất đồng bộ. Ví dụ, phương thức web dưới đây có chức năng tạm dừng một khoảng thời gian ngẫu nhiên từ 10 đến 19 giây:
- using System;
- using System.Web.Services;
- public class Wait : System.Web.Services.WebService {
- [WebMethod]
- public int Wait() {
- DateTime start = DateTime.Now;
- Random rand = new Random();
- TimeSpan delay = new TimeSpan(0, 0, rand.Next(10, 20));
- while (DateTime.Now < start.Add(delay)) {}
- return delay.Seconds;
- }
- }
Với đoạn mã trên, lớp proxy tương ứng sẽ gồm ba phương thức: Wait, BeginWait và EndWait. Phương thức Wait gọi phương thức web một cách đồng bộ. Phương thức BeginWait khởi chạy phương thức web trong một tiểu trình riêng và trả về ngay lập tức. Phương thức BeginXXX luôn nhận nhiều hơn phương thức gốc hai đối số và trả về một đối tượng IAsyncState. Hai đối số này được sử dụng để nhập thông tin trạng thái và một callback. Đối tượng IAsyncState cho phép bạn xác định khi nào lời gọi kết thúc. Ví dụ, bạn có thể định kỳ kiểm tra thuộc tính IAsyncState.IsComplete để xác định lời gọi phương thức đã hoàn tất chưa. Khi nó đã hoàn tất, bạn nhập đối tượng IAsyncState vào phương thức EndWait để nhận giá trị trả về từ phương thức web. Nếu bạn gọi EndWait trước khi phương thức web hoàn tất, mã lệnh của bạn sẽ đợi cho đến khi nó hoàn tất.
Có hai mẫu bất đồng bộ phổ biến dùng cho dịch vụ Web XML.
-Cách thứ nhất là gọi vài phương thức bất đồng bộ một lượt, rồi đợi chúng hoàn tất. Cách này cho phép bạn giảm thời gian đợi tổng cộng, và nó làm việc tốt nhất với đối tượng System.Threading.WaitHandle. Ví dụ dưới đây gọi phương thức Wait ba lần:
- using System;
- using System.Threading;
- public class WaitClient {
- [MTAThread]
- private static void Main() {
- localhost.WaitService proxy = new localhost.WaitService();
- DateTime startDate = DateTime.Now;
- // Gọi ba phương thức một cách bất đồng bộ.
- IAsyncResult handle1 = proxy.BeginWait(null, null);
- IAsyncResult handle2 = proxy.BeginWait(null, null);
- IAsyncResult handle3 = proxy.BeginWait(null, null);
- WaitHandle[] waitHandle = {handle1.AsyncWaitHandle, handle2.AsyncWaitHandle, handle3.AsyncWaitHandle};
- // Đợi cho cả ba phương thức hoàn tất.
- WaitHandle.WaitAll(waitHandle);
- int totalDelay = proxy.EndWait(handle1) +proxy.EndWait(handle2) + proxy.EndWait(handle3);
- TimeSpan elapsedTime = DateTime.Now - startDate;
- Console.WriteLine("Completed after " + elapsedTime.ToString());
- Console.WriteLine("Total delay time: " + totalDelay.ToString());
- }
- }
Trong trường hợp này, thời gian đã trôi qua nhỏ hơn thời gian trì hoãn tổng cộng:
Completed after 00:00:20.2591312
Total delay time: 47
Cách thứ hai là sử dụng callback. Bạn cần nhập một ủy nhiệm chỉ định một phương thức cụ thể trong mã lệnh. Khi phương thức web hoàn tất, ủy nhiệm này sẽ được gọi với đối số là một đối tượng IAsyncResult thích hợp. Dưới đây là đoạn mã gọi phương thức BeginWait (cùng với một callback):
- AsyncCallback callback = new AsyncCallback(Callback);
// Gọi phương thức một cách bất đồng bộ.
- proxy.BeginWait(callback, proxy);
Và đây là callback (sẽ được kích hoạt khi thao tác hoàn tất):
- public static void Callback(IAsyncResult handle) {
- localhost.WaitService proxy =
- (localhost.WaitService)handle.AsyncState;
- int result = proxy.EndWait(handle); Console.WriteLine("Waited " +
- result.ToString());
- }
[Nghean-Aptech st]
Các tin mới:
Hướng dẫn tích hợp giao diện trang quản trị SB Admin 2 vào Laravel 5.8.
Hướng dẫn tích hợp Google ReCaptcha v2 vào Laravel bằng curl.
Học lập trình React JS trong vòng 5 phút.
Sử dụng trình soạn thảo CKeditor tích hợp CKFinder với Laravel.
Hướng dẫn cài đặt Apache, PHP, MySQL, PHPMyAdmin trên Windows 10 và cấu hình SendMail.
Các tin cũ hơn:
Tự động refresh trang aspx với JavaScript.
Làm ứng dụng Windows Form mở toàn màn hình.
Sử dụng parttial class trong .NET.
Chuyển trang .aspx thành Web User Control.
Kiểm tra sự tồn tại địa chỉ Internet.