Nó có thể được thực hiện bằng cách sử dụng WaitHandle trong IAsyncResult trả về bởi mỗi phương pháp async.
Mã đơn giản. Trong Silverlight, tôi chỉ thực hiện 10 cuộc gọi dịch vụ để thêm một mục vào ListBox. Tôi sẽ đợi cho đến khi tất cả các cuộc gọi dịch vụ kết thúc để thêm một tin nhắn khác vào danh sách (điều này phải chạy trong một luồng khác để tránh chặn giao diện người dùng). Cũng lưu ý rằng việc thêm các mục vào danh sách phải được thực hiện thông qua Dispatcher vì chúng sẽ sửa đổi giao diện người dùng. Có rất nhiều lamdas, nhưng rất dễ làm theo.
public MainPage()
{
InitializeComponent();
var results = new ObservableCollection<string>();
var asyncResults = new List<IAsyncResult>();
resultsList.ItemsSource = results;
var service = new Service1Client() as Service1;
1.To(10).Do(i=>
asyncResults.Add(service.BeginDoWork(ar =>
Dispatcher.BeginInvoke(() => results.Add(String.Format("Call {0} finished: {1}", i, service.EndDoWork(ar)))),
null))
);
new Thread(()=>
{
asyncResults.ForEach(a => a.AsyncWaitHandle.WaitOne());
Dispatcher.BeginInvoke(() => results.Add("Everything finished"));
}).Start();
}
Chỉ cần để giúp đỡ với việc thử nghiệm, đây là dịch vụ
public class Service1
{
private const int maxMilliSecs = 500;
private const int minMillisSecs = 100;
[OperationContract]
public int DoWork()
{
int millisSecsToWait = new Random().Next(maxMilliSecs - minMillisSecs) + minMillisSecs;
Thread.Sleep(millisSecsToWait);
return millisSecsToWait;
}
}
Nguồn
2009-08-12 13:10:21
Câu hỏi. bạn có auto1 cho DoWork2. Nếu bạn có 3 cuộc gọi không đồng bộ. bạn sẽ chỉ thêm auto3 và đặt nó trong sự kiện DoWork3Completed? – H20rider