Just getting my hands on AsyncEnumerator library and not sure what piece I am missing.
I trying to get to run an example provided by the library author himself but have no clue what does the “Execute” in the line:
ae.Execute(ProcessAllAndEachOps(ae, urls));
method refer to.
Can anybody give me some clues?
UPDATE:
I managed to get it running by making a few changes which are already included in the code below. The credit goes to Peter for noticing that the Execute() method of the AsyncEnumerator object is obsolete and should be replaced with some helper function.
using System;
using System.Collections.Generic;
using System.Net;
using Wintellect.Threading.AsyncProgModel;
public static class AsyncEnumeratorPatterns {
private static void Execute(AsyncEnumerator ae, IEnumerator<Int32> enumerator){
ae.EndExecute(ae.BeginExecute(enumerator, null));
}
public static void Main() {
String[] urls = new String[] {
"http://Wintellect.com/",
"http://1.1.1.1/", // Demonstrates error recovery
"http://www.Devscovery.com/"
};
// Demonstrate process
AsyncEnumerator ae = new AsyncEnumerator();
Execute(ae, ProcessAllAndEachOps(ae, urls));
}
private static IEnumerator<Int32> ProcessAllAndEachOps(
AsyncEnumerator ae, String[] urls) {
Int32 numOps = urls.Length;
// Issue all the asynchronous operation(s) so they run concurrently
for (Int32 n = 0; n < numOps; n++) {
WebRequest wr = WebRequest.Create(urls[n]);
wr.BeginGetResponse(ae.End(), wr);
}
// Have AsyncEnumerator wait until ALL operations complete
yield return numOps;
Console.WriteLine("All the operations completed:");
for (Int32 n = 0; n < numOps; n++) {
ProcessCompletedWebRequest(ae.DequeueAsyncResult());
}
Console.WriteLine(); // *** Blank line between demos ***
// Issue all the asynchronous operation(s) so they run concurrently
for (Int32 n = 0; n < numOps; n++) {
WebRequest wr = WebRequest.Create(urls[n]);
wr.BeginGetResponse(ae.End(), wr);
}
for (Int32 n = 0; n < numOps; n++) {
// Have AsyncEnumerator wait until EACH operation completes
yield return 1;
Console.WriteLine("An operation completed:");
ProcessCompletedWebRequest(ae.DequeueAsyncResult());
}
}
private static void ProcessCompletedWebRequest(IAsyncResult ar) {
WebRequest wr = (WebRequest)ar.AsyncState;
try {
Console.Write(" Uri=" + wr.RequestUri + " ");
using (WebResponse response = wr.EndGetResponse(ar)) {
Console.WriteLine("ContentLength=" + response.ContentLength);
}
}
catch (WebException e) {
Console.WriteLine("WebException=" + e.Message);
}
}
}
As others have stated, the Execute method was deprecated a while ago and is now gone completely, that MSDN example is quite old.
That method slightly defeated the point of the AsyncEnumerator class, as the thread making the call will run the iterator until the first yield and then block until the iterator has finished processing.
So its maybe more clear to replace it with:
Which looks a little bit more like making regular APM calls from within an AsyncEnumerator iterator and makes the blocking more explicit.