Potrebbe essere fatto utilizzando il WaitHandle nel IAsyncResult restituita da ciascun metodo asincrono.
Il codice è semplice. In Silverlight faccio solo 10 chiamate di servizio che aggiungeranno un oggetto a un ListBox. Aspetterò fino a quando tutte le chiamate di servizio terminano per aggiungere un altro messaggio alla lista (questo deve essere eseguito in un thread diverso per evitare di bloccare l'interfaccia utente). Si noti inoltre che l'aggiunta di voci all'elenco deve essere eseguita tramite il Dispatcher poiché modificherà l'interfaccia utente. Ci sono un sacco di lamdas, ma è facile da seguire.
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();
}
solo per aiutare con i test, questo è il servizio
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;
}
}
fonte
2009-08-12 13:10:21
domanda. hai auto1 per DoWork2. Se hai avuto 3 chiamate asincrone. vuoi semplicemente aggiungere auto3 e impostarlo nell'evento DoWork3Completed? – H20rider