在等待N个异步方法完成时是否有标准模式?

mic*_*ael 11 c# wcf events design-patterns asynchronous

public class FooDataRepository
{
    private MyServiceReferenceClient Client { get; set; }

    public void FooClass()
    {
        Client = new MyServiceReferenceClient();
        Client.SaveFooCompleted += Client_SaveFooCompleted;
        Client.SaveBarCompleted += Client_SaveBarCompleted;
    }

    private void Client_SaveFooCompleted(Object sender, EventArgs e) { ... }

    private void Client_SaveBarCompleted(Object sender, EventArgs e) { ... }

    public void SaveFoo(Foo foo)
    {
        Client.SaveFooAsync(foo);

        foreach (var bar in foo.Bars)
            Client.SaveBarAsync(bar);
    }

}
Run Code Online (Sandbox Code Playgroud)

一旦完成SaveFooAsync所有SaveBarAsync方法,我想在FooDataRepository类中做一些事情.是否存在基于N个异步调用完成的尝试执行单个操作的标准模式?

Gio*_*rgi 5

您可以使用TaskFactory.ContinueWhenAll来安排在所有任务完成后运行的代码.

Task[] tasks = new Task[3]
{
    Task.Factory.StartNew(() => MethodA()),
    Task.Factory.StartNew(() => MethodB()),
    Task.Factory.StartNew(() => MethodC())
};

//This will not block.
Task.Factory.ContinueWhenAll(tasks, completedTasks => { RunSomeMethod(); });
Run Code Online (Sandbox Code Playgroud)

编辑:

关于使用任务组合异步方法调用的问题,如果类具有以异步方式调用方法的Begin/End方法,则可以使用Task.FromAsync

或者,您也可以使用Rx异步调用多个方法,然后观察所有方法何时完成.看看这个问题:我可以通过使用事件来创建我的AsyncResult来快捷开始/结束异步模式吗?(C#.Net 3.5,WCF)