2012-01-16 58 views
8

Tôi có một ứng dụng Silverlight sử dụng các hành động để lấy dữ liệu từ mô hình (một lần nữa lấy dữ liệu từ các dịch vụ WCF).Thao tác đồng bộ hóa trong Silverlight

Tôi cần phải bằng cách nào đó đồng bộ hóa hai ActionCallbacks hoặc đợi chúng, sau đó thực thi một số mã.

Ví dụ:

_model.GetMyTypeList(list => 
{ 
    MyTypeList.AddRange(list); 
}); 

_model.GetStigTypeList(list => 
{ 
    StigTypeList.AddRange(list); 
}); 

doSomethingWhenBothHaveReturned(); 

Tôi biết tôi có thể sử dụng một bộ đếm để theo dõi có bao nhiêu đã trở lại, nhưng là có không phải là một cách tốt hơn để làm điều này?

EDIT: user24601 có câu trả lời hay, nhưng CountdownEvent không tồn tại trong Silverlight, bất kỳ ý tưởng tuyệt vời nào khác? :)

+0

Không chắc, nhưng Tôi nghĩ [Tiện ích mở rộng phản hồi] (http://msdn.microsoft.com/en-us/data/gg577609) có thể giúp bạn ở đó. –

+0

Các cuộc gọi đến các dịch vụ có đồng bộ không? – Glenn

+0

Có họ là glenn. – randoms

Trả lời

4

Giải quyết được vấn đề tự của tôi, sử dụng một bộ đếm:

public class ActionWaitHandler 
{ 
    private int _count; 
    private readonly Action _callback; 

    public ActionWaitHandler(int count, Action callback) 
    { 
     _count = count; 
     _callback = callback; 
    } 

    public void Signal() 
    { 
     _count--; 
     if (_count == 0) 
     { 
      _callback(); 
     } 
    } 
} 

sử dụng:

public void method() { 
    var handler = new ActionWaitHandler(2, OnActionsComplete); 

    _model.GetMyTypeList(list => 
    { 
     MyTypeList.AddRange(list); 
     handler .Signal(); 
    }); 

    _model.GetStigTypeList(list => 
    { 
     StigTypeList.AddRange(list); 
     handler .Signal(); 
    }); 
} 

public void OnActionsComplete() 
{ 
    dosomething; 
} 
+1

Vâng, bắt tốt. Có vẻ như không có trên Silverlight. – DanTheMan

9

Có, bộ đếm là những gì bạn cần. Giải pháp 'thanh lịch hơn' sẽ được sử dụng một sự kiện đếm ngược:

using (CountDownEvent countDownEvent = new CountDownEvent(2)) 
{ 
    _model.GetMyTypeList(list => 
    { 
     MyTypeList.AddRange(list); 
     countDownEvent.Signal(); 
    }); 

    _model.GetStigTypeList(list => 
    { 
     StigTypeList.AddRange(list); 
     countDownEvent.Signal(); 
    }); 

    countdownEvent.Wait(); 
    doSomethingNowThatWereComplete(); 
} 
+1

tôi đoán đây là cách tiếp cận đúng với .net 4, nhưng không giống như lớp có sẵn cho silverlight. – randoms

Các vấn đề liên quan