ASP.NET加速处理异步请求的结果

时间:2012-11-05 19:04:11

标签: asp.net multithreading asynchronous

我最近刚刚将我的网站请求转换为异步,它的速度提前了三倍,但我发现了一个缺点。让我解释一下,我对页面使用20个不同的请求。当页面被加载时,我解析结果,并将它们添加到字典中,完成后我检查字典中的密钥我提供了一个我得到的信息是否发现了信息。

在异步之前,运行所有20个请求时大约需要30秒。今天我在大约7秒内运行了20个请求,提升了很多,但是....如果旧方法在第一个请求中找到了信息,它在2秒内完成。使用此方法总是需要7秒。

如何在找到信息后完成所有事情?而不是做所有二十个请求。这是代码。

编辑我试图取消等待,但是我的表现很糟糕。

public decimal GetWebpage(string urltovisit, string visitorurl, string information)
    {
        List<HtmlDocument> htmllist = new List<HtmlDocument>();
        System.Net.ServicePointManager.DefaultConnectionLimit = 10;
        FetchPageDelegate del = new FetchPageDelegate(FetchPage);
        List<IAsyncResult> results = new List<IAsyncResult>();
        List<WaitHandle> waitHandles = new List<WaitHandle>();
        _visitorUrl = visitorurl;
        _theSearchedinformation = information;

        for (int i = 0; i < 200; i += 10)
        {
            string url = urltovisit + i;
            IAsyncResult result = del.BeginInvoke(url, null, null);
            results.Add(result);
            waitHandles.Add(result.AsyncWaitHandle);
        }

        WaitHandle.WaitAll(waitHandles.ToArray());

        foreach (IAsyncResult async in results)
        {
            FetchPageDelegate pagedelagate = (async as AsyncResult).AsyncDelegate as FetchPageDelegate;
            //THIS FUNCTION PARSES AND ADDS THE RESULT TO A DICTIONARY
            DocParser.StartParse(pagedelagate.EndInvoke(async));

            if (GetPostion() != 201)
            {   //ADD DATA TO DATABASE
                InsertRankingData(DocParser.GetSearchResults(), _theSearchedinformation);
                return GetPostion();
            }

        }
        return 201;
      }

那么我应该创建一个新的delagates列表来运行解析并添加到字典中的方法和类吗?或者我可以使用等待句来判断结果是否已找到?我真的很无能吗?

1 个答案:

答案 0 :(得分:0)

使用撤消处理程序集合并返回标记。


var done=false
var index = WaitHandle.WaitAny(waitHandles.ToArray());
while(!done)
{
  var async=waitHandles.ElementAt(index);
  WaitHandle.RemoveAt(index);
  FetchPageDelegate pagedelagate = (async as AsyncResult).AsyncDelegate as FetchPageDelegate;

  // change done flag

}

但是使用Wintellect Power Threading更加舒适