487
Chương 12: Dịch vụ Web XML và Remoting
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);