在执行异步请求时如何发出waithandle.waitany信号?

时间:2012-11-05 22:19:02

标签: asp.net multithreading asynchronous

我使用以下示例代码使用异步请求获取一些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;
            }
        }
    }

0 个答案:

没有答案