0

我正在使用以下示例代码使用异步请求获取一些 HTML 页面。

我不想等到使用 WaitHandle.WaitAll 的每个请求都完成后,才等到找到正确的值。我目前正在这样做,但是将 ManualResetEvents 发送到线程感觉不对。是不是应该怎么做?有没有更好的办法?

    public static void runprogram()
    {

        System.Net.ServicePointManager.DefaultConnectionLimit = 20;
        FetchPageDelegate del = new FetchPageDelegate(FetchPage);
        List<HtmlDocument> htmllist = new List<HtmlDocument>();
        List<IAsyncResult> results = new List<IAsyncResult>();
        List<WaitHandle> waitHandles = new List<WaitHandle>();
        List<ManualResetEvent> handles = new List<ManualResetEvent>();

        for (int i = 0; i < 20; i++)
        {
            ManualResetEvent e = new ManualResetEvent(false);
            handles.Add(e);
        }

        for(int i = 0; i < 200; i += 10)
        {
            int y = 0;
            string url = @"URLTOPARSE" + i;
            IAsyncResult result = del.BeginInvoke(url, handles[y], null, null);
            results.Add(result);
            waitHandles.Add(result.AsyncWaitHandle);

            y++;
        }
        //Here i check for a signal
        WaitHandle.WaitAny(handles.ToArray());

        //WaitHandle.WaitAll(waitHandles.ToArray());

        foreach (IAsyncResult async in results)
        {

           FetchPageDelegate delle = (async as AsyncResult).AsyncDelegate as FetchPageDelegate;
           HtmlDocument htm = delle.EndInvoke(async);

            if(htm.DocumentNode.InnerHtml.Contains("ANYTHING TO CHECK FOR(ONLY A TEST"))
            { 
                return;
            }
        }
    }
4

0 回答 0