2012-05-22 39 views
0

只需掌握AsyncEnumerator库并不确定缺少哪一部分。 我试图去运行由库的作者提供an example自己,但不知道什么是该行“执行”:AsyncEnumerator使用示例

ae.Execute(ProcessAllAndEachOps(ae, urls)); 

方法参考。 有人可以给我一些线索吗?

更新: 我设法通过对以下代码中已包含的一些更改进行运行。值得注意的是,Peter注意到AsyncEnumerator对象的Execute()方法已经过时,应该用一些辅助函数替换掉。

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); 
     } 
    } 
} 
+0

从给定的代码片段看来,它似乎只是启动asyncenumeration过程。 – daryal

+0

嗯,是的,它确实开始执行,但它在哪里定义? – matcheek

+0

右键单击它并选择“转到定义”。这应该给你提示方法的定义。 –

回答

0

正如其他人所说的,Execute方法在前一段时间被弃用,现在完全消失了,MSDN示例已经很老了。

该方法轻微击败了AsyncEnumerator类的点,因为调用的线程将运行迭代器直到第一个yield,然后阻塞,直到迭代器完成处理。

所以它也许更清晰用来替换:

var asyncResult = ae.BeginExecute(ProcessAllAndEachOps(ae, urls), null); 
asyncResult.AsyncWaitHandle.WaitOne(); 
ae.EndExecute(asyncResult); 

这看起来有点更像制作规整APM从AsyncEnumerator迭代器中调用,使拦截更加明确。