Группа Dispatcher.Invoke в той же функции - PullRequest
0 голосов
/ 27 марта 2012

Как сгруппировать число Dispatcher.Invoke и дождаться завершения одной группы, прежде чем запускать следующую группу?

Возьмем, к примеру, следующее: первая группа создает два потока, которые работают одновременно. После завершения обоих потоков запускается вторая группа потоков и т. Д.

private void FooMethod()
{
    // First group
    dispatcher.Invoke(new FooDelegate(Foo), cmd1A);
    dispatcher.Invoke(new FooDelegate(Foo), cmd1B);

    // Second group
    dispatcher.Invoke(new FooDelegate(Foo), cmd2A);
    dispatcher.Invoke(new FooDelegate(Foo), cmd2B);

    // Third group
    dispatcher.Invoke(new FooDelegate(Foo), cmd3A);
    dispatcher.Invoke(new FooDelegate(Foo), cmd3B);

    ....
}

1 Ответ

1 голос
/ 27 марта 2012

Вы можете создать класс-оболочку вокруг диспетчера с очередью для обработки групп.Код может быть грязным, но он должен дать общую идею:

public class DispatcherGroup
{
    private List<Action> _delegates;
    private List<object[]> _parameters;
    private ManualResetEvent _isFinished;

    public void Add(Action toInvoke, params object[] parameters)
    {
        _delegates.Add(toInvoke);
        _parameters.Add(parameters);
    }

    public void Invoke(Dispatcher dispatcher)
    {
        List<DispatcherOperation> operations = new List<>();
        for(int i = 0; i < _delegates.Length; i++)
        {
            DispatcherOperation operation = dispatcher.BeginInvoke(_delegates[i], _parameters[i]);
            operations.Add(operation);
        }

        // check status of all operations before completion
    }

}

public class DispatcherGroupInvoker
{
    private Queue<DispatcherGroup> _groups;
    public Dispatcher Dispatcher { get;set;}
    public void Invoke()
    {
        while (!_groups.Count != 0)
        {
            DispatcherGroup group = _groups.Dequeue();
            group.Invoke(Dispatcher);
        }
    } 
}
...