2012-04-27 7 views
6

Folgendes Programm verbindet sich mit dem Internet und HTML-Inhalt von "msnbc.com" Webseite erhalten und das Ergebnis ausdrucken. Wenn es länger als 2 Sekunden dauert, um Daten von der Webseite abzurufen, möchte ich, dass meine Methode nicht mehr funktioniert und zurückkehrt. Kannst du mir bitte sagen, wie ich das mit einem Beispiel machen kann?C# Wie kann ich eine Methode stoppen, wenn sie länger als 2 Sekunden dauert?

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

Sie wollen wahrscheinlich den Abruf in einem Thread ausgeführt werden, und den Faden ab, wenn es mehr als zwei Sekunden dauert (über einen Timer setup/invoke). – ashes999

+6

@ Ashes999: Das ist eine sehr, sehr schlechte Idee. ** Abbrechen eines Threads nur, wenn Sie den gesamten Prozess abbauen möchten. ** Das Abbrechen eines Threads sollte der letzte Ausweg sein. Durch das Abbrechen eines verwalteten Threads können Datenstrukturen willkürlich beschädigt werden. –

+0

Vielen Dank für Ihre Antworten. –

Antwort

4

Wie oben .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"); 
     } 
    } 
angegeben
+0

Vielen Dank, dass Sie mich mit einem Beispiel gezeigt haben. –

6

Stellen Sie die Timeout Eigenschaft Ihres WebRequest Objekt. Documentation

MSDN Beispiel:

// 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. Vergessen Sie nicht, die Timeout-Ausnahme zu behandeln, wenn Sie sie verwenden. –

2

können Sie verwenden, um die TimeOut Eigenschaft auf HttpWebRequest

0

Betrachten wir zum asynchronen Herunterladen des Inhalts wechseln. Sie hören auf, den UI-Thread zu blockieren und können problemlos mehrere Anfragen bearbeiten. Sie können das Zeitlimit erheblich erhöhen, ohne die Benutzeroberfläche zu beeinträchtigen. Sie können entscheiden, ob Sie eine Antwort erhalten möchten, wenn Sie weiterhin Daten abrufen möchten.

12

Zwei Sekunden ist viel zu lange die Benutzeroberfläche zu blockieren. Sie sollten die Benutzeroberfläche nur blockieren, wenn Sie planen, das Ergebnis zu erhalten, beispielsweise fünfzig Millisekunden oder weniger.

Lesen Sie diesen Artikel auf, wie die Benutzeroberfläche eine Web-Anfrage zu tun, ohne zu blockieren:

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

Beachten Sie, dass dies alles wird viel einfacher in C# 5, die derzeit in der Beta-Version. In C# 5 können Sie einfach den Operator await verwenden, um das Ergebnis der Aufgabe asynchron abzufragen. Wenn Sie sehen möchten, wie diese Art der Sache arbeitet in C# 5, siehe:

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

Verwandte Themen