Câu hỏi của bạn là một chút không rõ ràng (nó phải được count <=
?), Nhưng ở đây đi ...
gì bạn đang yêu cầu là làm thế nào để làm một đồng bộ gọi. Với cuộc gọi không đồng bộ, trước khi bạn thực hiện cuộc gọi, bạn chỉ định trình xử lý sự kiện sẽ được gọi sau khi hoàn thành cuộc gọi, sau đó bạn thực hiện cuộc gọi. Điều này có nghĩa là mã hoàn thành của bạn nằm trong một chức năng khác với mã thực hiện cuộc gọi. Điều này có nghĩa là nếu cuộc gọi không đồng bộ của bạn được thực hiện trên luồng giao diện người dùng, giao diện người dùng sẽ không chặn khi cuộc gọi được thực hiện.
Có thể thực hiện cuộc gọi đồng bộ trong Silverlight, nhưng bạn phải đảm bảo rằng bạn không thực hiện chúng trên chuỗi giao diện người dùng. Một cách để đạt được điều này là bắt đầu một chuỗi nền mới, thực hiện cuộc gọi async trên chuỗi nền, nhưng chặn trả lại cho đến khi cuộc gọi kết thúc. Đây là một mẫu mã giả:
private AutoResetEvent myResetEvent;
private void MyCallFunction(object someParameter) {
if (this.Dispatcher.CheckAccess())
{
Action<object> a = new Action<object>(MyCallFunction);
a.BeginInvoke(someParameter, null, null);
return;
}
myResetEvent = new AutoresetEvent();
myAsyncCall.CallCompleted += new EventHandler<>(myAsyncCall_CallCompleted);
myAsyncCall.DoAsyncCall(someParameter);
myResetEvent.WaitOne();
//increment your count here
}
private void myAsyncCall_CallCompleted(object sender, SomeEventArgs e) {
if (e.Error == null && !e.Cancelled) {
if (myResetEvent != null)
myResetEvent.Set();
}
}
Lưu ý rằng mã này không đặc biệt là chủ đề an toàn hoặc sản xuất sẵn sàng - nó chỉ là một mẫu nhanh chóng.
Điều gì xảy ra ở đây là khi bạn nhập MyCallFunction
, nó sẽ kiểm tra xem nó có đang chạy trên chuỗi giao diện người dùng hay không, nếu sau đó nó tự gọi lại trên chuỗi nền. Sau đó, nó thiết lập một AutoResetEvent và thực hiện cuộc gọi không đồng bộ.Sau đó nó dừng lại trên đối tượng myResetEvent
cho đến khi nó được thiết lập (hoặc 'được báo hiệu') từ trình xử lý cuộc gọi đã hoàn thành, tại đó việc thực hiện mã điểm tiếp tục. Lưu ý rằng bạn không nên cố gắng truy cập một điều khiển trực tiếp từ mã như thế này mà không cần đảm bảo rằng bạn đã quay trở lại luồng giao diện người dùng.
Khi tôi bắt đầu tìm hiểu cách thực hiện việc này trong Silverlight, tôi bắt đầu với this SO post và tiếp tục với this link. Nhưng như Marc gravell nói trong bài viết đầu tiên, đừng làm điều đó nếu bạn có thể tránh được nó. Lần duy nhất tôi cần làm điều này là khi tôi cần tổng hợp kết quả của một vài cuộc gọi WCF khác nhau thành một kết quả được trả về giao diện người dùng (và những cuộc gọi này không thể kết hợp với một phương thức WCF mặt tiền).
Semaphore trên Silverlight? –