Se podría hacer usando el WaitHandle en el IAsyncResult devuelto por cada método asíncrono.
El código es simple. En Silverlight solo hago 10 llamadas de servicio que agregarán un elemento a un ListBox. Esperaré hasta que todas las llamadas al servicio finalicen para agregar otro mensaje a la lista (esto tiene que ejecutarse en un hilo diferente para evitar el bloqueo de la IU). También tenga en cuenta que agregar elementos a la lista debe hacerse a través del Dispatcher, ya que modificarán la UI. Hay un montón de lamdas, pero es fácil de seguir.
public MainPage()
{
InitializeComponent();
var results = new ObservableCollection<string>();
var asyncResults = new List<IAsyncResult>();
resultsList.ItemsSource = results;
var service = new Service1Client() as Service1;
1.To(10).Do(i=>
asyncResults.Add(service.BeginDoWork(ar =>
Dispatcher.BeginInvoke(() => results.Add(String.Format("Call {0} finished: {1}", i, service.EndDoWork(ar)))),
null))
);
new Thread(()=>
{
asyncResults.ForEach(a => a.AsyncWaitHandle.WaitOne());
Dispatcher.BeginInvoke(() => results.Add("Everything finished"));
}).Start();
}
sólo para ayudar con las pruebas, este es el servicio
public class Service1
{
private const int maxMilliSecs = 500;
private const int minMillisSecs = 100;
[OperationContract]
public int DoWork()
{
int millisSecsToWait = new Random().Next(maxMilliSecs - minMillisSecs) + minMillisSecs;
Thread.Sleep(millisSecsToWait);
return millisSecsToWait;
}
}
pregunta. tienes auto1 para DoWork2. Si tuviste 3 llamadas asincrónicas ¿simplemente agregaría auto3 y lo configuraría en el evento DoWork3Completed? – H20rider