2012-03-27 79 views
0

如何分组若干Dispatcher.Invoke并在运行以下组之前等待一个组完成?Group Dispatcher.Invoke in the same function

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

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

    .... 
} 
+0

请有看看http://stackoverflow.com/questions/3824967/how-to-properly-wait-for-multiple-threads- that-c​​all-dispatcher-invoke-to-finish – daryal 2012-03-27 06:34:22

+0

我已经看过你提到的帖子了......但是它是一团糟明白.. – KMC 2012-03-27 07:00:23

回答

1

你可以在带有队列的分派器周围创建一个包装类来处理组。代码可以是凌乱的,但它应该提供的总体思路:

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

你可以添加一些解释吗?不能遵循代码。另外,DispatcherOperation的类在哪里? – KMC 2012-03-27 07:02:44

+0

您可以通过添加必要的操作和参数来创建要呼叫的组。从你的例子 - 代表cmd1A,没有参数的cmd1B - 是第一组;等等。 然后您将这些组添加到groupInvoker(忘记了添加方法)。 然后调用GroupInvoker.Invoke,它逐个调用组。每个组都会等待所有代表通过DispatcherOperation.Status完成处理。 – 2012-03-27 07:06:58

+0

+ 1感谢您的努力。但我完全不明白你在说什么。 – KMC 2012-03-27 07:11:44

相关问题