Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 组调度程序。在同一函数中调用_C#_Wpf_Multithreading_Dispatcher - Fatal编程技术网

C# 组调度程序。在同一函数中调用

C# 组调度程序。在同一函数中调用,c#,wpf,multithreading,dispatcher,C#,Wpf,Multithreading,Dispatcher,如何对多个调度程序进行分组。在运行以下组之前,调用并等待一个组完成 以下面的示例为例,第一个组创建两个并发运行的线程。两个线程完成后,第二组线程开始,依此类推 private void FooMethod() { // First group dispatcher.Invoke(new FooDelegate(Foo), cmd1A); dispatcher.Invoke(new FooDelegate(Foo), cmd1B); // Second group

如何对多个调度程序进行分组。在运行以下组之前,调用并等待一个组完成

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

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

    ....
}

您可以围绕dispatcher创建一个包装类,并使用队列来处理组。代码可能很混乱,但它应该传达出一个总体思路:

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);
        }
    } 
}
公共类DispatcherGroup
{
私人名单代表;
私有列表参数;
私人手动重置事件完成;
public void Add(操作到Invoke,参数对象[]参数)
{
_代表。添加(toInvoke);
_参数。添加(参数);
}
公共无效调用(调度程序)
{
列表操作=新建列表();
对于(int i=0;i<\u delegates.Length;i++)
{
DispatcherOperation=dispatcher.BeginInvoke(_委托[i],_参数[i]);
操作。添加(操作);
}
//完成前检查所有操作的状态
}
}
公共类DispatcherGroupInvoker
{
专用队列组;
公共调度程序{get;set;}
公共无效调用()
{
而(!\u groups.Count!=0)
{
DispatcherGroup=_groups.Dequeue();
组调用(调度程序);
}
} 
}

请看我已经看了你提到的帖子。。。但是理解起来很混乱你能解释一下吗?无法遵循代码。另外,DispatcherOperation的类在哪里?您可以通过添加必要的操作和参数来创建要调用的组。从您的示例中,委托cmd1A、cmd1B(不带参数)是第一组;等等然后将这些组添加到groupInvoker(忘记了add方法)。然后调用GroupInvoker.Invoke,它逐个调用组。每个组等待所有代理通过DispatcherOperation.Status完成处理。+1感谢您的努力。但我完全不明白你在说什么。我最终会发布用法示例。:)