2012-04-27 63 views
6

Następujący program połączy się z internetem i pobierze zawartość html ze strony "msnbc.com" i wydrukuje wynik. Jeśli pobranie danych ze strony trwa dłużej niż 2 sekundy, chcę, aby moja metoda przestała działać i powróciła. Czy możesz mi powiedzieć, jak mogę to zrobić na przykładzie?C# Jak zatrzymać metodę, jeśli trwa to dłużej niż 2 sekundy?

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); 
    } 
} 
+3

Prawdopodobnie chcesz wykonać fetch w wątku, i przerwać wątek jeśli trwa dłużej niż dwie sekundy (poprzez konfigurację/wywołanie czasomierza). – ashes999

+6

@ ashes999: To bardzo, bardzo zły pomysł. ** Przerwij tylko wątek, jeśli planujesz przerwać cały proces. ** Przerwanie wątku powinno być ostatecznością. Przerwanie zarządzanego wątku może dowolnie uszkodzić struktury danych. –

+0

Wielkie dzięki za wszystkie odpowiedzi. –

Odpowiedz

4

Jak stwierdzono powyżej .Timeout

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"); 
     } 
    } 
+0

Wielkie dzięki za pokazanie mi na przykładzie. –

6

Ustaw właściwość swojego obiektu WebRequestTimeout. Documentation

MSDN Przykład:

// Create a new WebRequest Object to the mentioned URL. 
WebRequest myWebRequest=WebRequest.Create("http://www.contoso.com"); 
Console.WriteLine("\nThe Timeout time of the request before setting is : {0} milliseconds",myWebRequest.Timeout); 

// Set the 'Timeout' property in Milliseconds. 
myWebRequest.Timeout=10000; 

// This request will throw a WebException if it reaches the timeout limit before it is able to fetch the resource. 
WebResponse myWebResponse=myWebRequest.GetResponse(); 
+0

+1. Nie zapomnij poradzić sobie z wyjątkiem timeout, gdy go używasz. –

0

rozważyć przejście do asynchronicznego pobierania zawartości. Przestaniesz blokować wątek UI i będziesz w stanie z łatwością obsługiwać wiele żądań. Będziesz w stanie znacząco wydłużyć czas bez wpływu na interfejs użytkownika i możesz zdecydować o otrzymaniu odpowiedzi, jeśli nadal chcesz pobierać dane.

12

Dwie sekundy to zbyt długo zablokować UI. Powinieneś zablokować interfejs użytkownika, jeśli planujesz uzyskać wynik, powiedzmy, pięćdziesiąt milisekund lub mniej.

Przeczytaj ten artykuł na temat jak to zrobić wniosek internetowej bez blokowania UI:

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

Należy pamiętać, że to wszystko będzie o wiele łatwiejsze w C# 5, która jest w wersji beta w chwili obecnej. W C# 5 można po prostu użyć operatora await do asynchronicznego oczekiwania na wynik zadania. Jeśli chcesz zobaczyć, jak tego typu rzeczy będą pracować w C# 5, patrz:

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

Powiązane problemy