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感谢您的努力。但我完全不明白你在说什么。我最终会发布用法示例。:)