2012-01-16 2 views
8

У меня есть приложение Silverlight, которое использует действия для получения данных из модели (которая снова получает данные из служб WCF).Синхронизирующие действия в Silverlight

Мне нужно как-то синхронизировать два ActionCallbacks или ждать их, а затем выполнить некоторый код.

Пример:

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

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

doSomethingWhenBothHaveReturned(); 

Я знаю, что могу использовать счетчик, чтобы отслеживать, сколько вернулся, но не лучший способ сделать это?

EDIT: Пользователь24601 имеет хороший ответ, но CountdownEvent не существует в silverlight, каких-либо других замечательных идеях? :)

+0

Не уверен, но Я думаю, что [Reactive Extensions] (http://msdn.microsoft.com/en-us/data/gg577609) могут вам помочь. –

+0

Являются ли призывы к услугам asyncrouns? – Glenn

+0

Да, они гленн. – randoms

ответ

4

решена проблема мой сам, используя счетчик:

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(); 
     } 
    } 
} 

использование:

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

Да, хорошо поймать. Кажется, что он недоступен в Silverlight. – DanTheMan

9

Да, счетчик - это то, что вам нужно. 'Более элегантным' решением было бы использовать событие обратного отсчета:

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

Я предполагаю, что это правильный подход с .net 4, но не похоже, что класс доступен для silverlight. – randoms