组调度程序.在同一函数中调用

本文关键字:函数 调用 调度程序 | 更新日期: 2023-09-27 18:29:17

如何对多个Dispatcher进行分组。调用并等待一个组完成后再运行以下组?

以下面的例子为例,第一组创建两个并发运行的线程。在两个线程都完成之后,第二组线程开始,依此类推。

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

组调度程序.在同一函数中调用

您可以在带有队列的调度器周围创建一个包装类来处理组。代码可能很混乱,但它应该提供大致的想法:

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