Синхронизация действий в Silverlight - PullRequest
8 голосов
/ 16 января 2012

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

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

Пример:

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

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

doSomethingWhenBothHaveReturned();

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

РЕДАКТИРОВАТЬ: user24601 имеет хороший ответ, но CountdownEvent не существует в silverlight, какие-нибудь другие великие идеи?:)

Ответы [ 2 ]

9 голосов
/ 16 января 2012

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

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();
}
4 голосов
/ 18 января 2012

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

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;
}
...