यह WaitHandle का उपयोग किया जा सकता है IAsyncResult में प्रत्येक async विधि से लौट आए।
कोड सरल है। सिल्वरलाइट में मैं केवल 10 सेवा कॉल करता हूं जो एक सूची को सूची बॉक्स में जोड़ देगा। मैं तब तक प्रतीक्षा करूंगा जब तक कि सभी सेवा कॉल सूची में कोई अन्य संदेश जोड़ने के लिए समाप्त न हों (यूआई को अवरुद्ध करने से बचने के लिए इसे एक अलग थ्रेड में चलाना होगा)। यह भी ध्यान रखें कि सूची में आइटम को डिस्पैचर के माध्यम से करना होगा क्योंकि वे यूआई को संशोधित करेंगे। लैमडास का एक गुच्छा है, लेकिन इसका पालन करना आसान है।
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();
}
बस परीक्षण के साथ मदद करने के लिए, इस सेवा के
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;
}
}
स्रोत
2009-08-12 13:10:21
प्रश्न है। आपके पास DoWork2 के लिए auto1 है। अगर आपके पास 3 एसिंक कॉल थे। क्या आप केवल ऑटो 3 जोड़ देंगे और इसे DoWork3 पूर्ण ईवेंट में सेट करेंगे? – H20rider