试图多次做某事

时间:2013-12-10 03:00:39

标签: c#

我有这个简单的函数试图获取页面Html,如果抛出异常则返回null

 public static string TryGetPageHtml(string link, System.Net.WebProxy proxy = null)
        {
            System.Net.WebClient client = new System.Net.WebClient() { Encoding = Encoding.UTF8 };
            if (proxy != null)
            {
                client.Proxy = proxy;
            }

            using (client)
            {
                try
                {
                    return client.DownloadString(link);
                }
                catch (Exception ex)
                {
                    return null;
                }
            }

        }

我想调用此函数3次,如果它返回null三次,这意味着它faild,所以我想出了以下

这样做的一种方法是

        string HTML = null;
        int triesRemaining = 3;
        while (HTML == null && triesRemaining--!=0)
        {
            HTML = TryGetPageHtml(link,getrandomproxy());
        }
        if(HTML == null){//do the handlig}

和我提出的另一个是

HTML = TryGetPageHtml(link,getrandomproxy())??TryGetPageHtml(link,getrandomproxy())??TryGetPageHtml(link,getrandomproxy());
             if(HTML == null){//do the handlig}

是否有更好的方法,并且.net中内置了可以使其更具可读性的内容?

3 个答案:

答案 0 :(得分:3)

当找到html:

时,可以通过中断执行for循环
        string HTML = null;
        for (int i = 0; i < 3; i++)
        {
            HTML = TryGetPageHtml(link, getrandomproxy());
            if (HTML != null)
                break;
        }

答案 1 :(得分:1)

或者您可以将其设置为递归函数,将尝试次数作为参数。

public static string TryGetPageHtml(string link, int attempCount = 1,
 System.Net.WebProxy proxy = null, string foundHTML = null)
{
    if(attemptCount == 0 || foundHTML != null)
    {
        return foundHTML;
    }

    if (proxy != null)
    {
        client.Proxy = proxy;
    }

    using (System.Net.WebClient client = new System.Net.WebClient())
    {
        client.Encoding = Encoding.UTF8;

        try
        {
            foundHTML = client.DownloadString(link);
        }
        catch (Exception ex)
        {
            return null; //Remove this if we want to retry on exception
        }
        finally
        {
            return TryGetPageHtml(link, --attemptCount, proxy, foundHTML);
        }
    }
}

答案 2 :(得分:0)

这个怎么样?可能更具可读性。

var iCount = 0;
string HTML = null;

while (iCount++ < 3 && HTML == null)
{
    HTML = TryGetPageHtml(link, getrandomproxy());
}