2012-03-27 81 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

相關問題