В C# Как остановить метод, если он занимает больше 2 секунд?

следующая программа подключится к сети и получит html-содержимое "msnbc.com" веб-страница и распечатайте результат. Если для получения данных с веб-страницы требуется более 2 секунд, я хочу, чтобы мой метод перестал работать и вернулся. Не могли бы вы сказать мне, как я могу сделать это на примере?

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        gethtml();
        MessageBox.Show("End of program");
    }

    public void gethtml()
    {
        HttpWebRequest WebRequestObject = (HttpWebRequest)HttpWebRequest.Create("http://msnbc.com/");

        WebResponse Response = WebRequestObject.GetResponse();
        Stream WebStream = Response.GetResponseStream();

        StreamReader Reader = new StreamReader(WebStream);
        string webcontent = Reader.ReadToEnd();
        MessageBox.Show(webcontent);
    }
}

5 ответов


Как указано выше .Ожидания

    public void gethtml()
    {
        HttpWebRequest WebRequestObject = (HttpWebRequest)HttpWebRequest.Create("http://msnbc.com/");
        WebRequestObject.Timeout = (System.Int32)TimeSpan.FromSeconds(2).TotalMilliseconds;
        try
        {
            WebResponse Response = WebRequestObject.GetResponse();
            Stream WebStream = Response.GetResponseStream();

            StreamReader Reader = new StreamReader(WebStream);
            string webcontent = Reader.ReadToEnd();
            MessageBox.Show(webcontent);
        }
        catch (System.Net.WebException E)
        {
            MessageBox.Show("Fail");
        }
    }

две секунды-это слишком долго для блокировки пользовательского интерфейса. Вы должны блокировать пользовательский интерфейс, только если вы планируете получить результат, скажем, пятьдесят миллисекунд или меньше.

прочитайте эту статью о том, как сделать веб-запрос Без блокировки пользовательского интерфейса:

http://www.developerfusion.com/code/4654/asynchronous-httpwebrequest/

обратите внимание, что все это будет намного проще в C# 5, который в настоящее время находится в бета-версии. В C# 5, Вы можете просто использовать the await оператор для асинхронного ожидания результата задачи. Если вы хотите увидеть, как это будет работать в C# 5, см.:

http://msdn.microsoft.com/en-us/async


установить Timeout свойства


можно использовать тайм-аут свойство HttpWebRequest


рассмотрите возможность переключения на асинхронную загрузку содержимого. Вы будет блокировать поток пользовательского интерфейса и сможете легко обрабатывать несколько запросов. Вы сможете значительно увеличить время ожидания без влияния на пользовательский интерфейс и можете принять решение о получении ответа, если вы все еще хотите получить данные.