2012-04-27 8 views
6

Il seguente programma si collegherà al web e otterrà il contenuto html della pagina Web "msnbc.com" e stamperà il risultato. Se ci vogliono più di 2 secondi per ottenere i dati dalla pagina web, voglio che il mio metodo smetta di funzionare e restituisca. Per favore, dimmi come posso farlo con un esempio?C# Come fermare un metodo se impiega più di 2 secondi?

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

Probabilmente si desidera eseguire l'operazione di recupero in un thread, e interrompere il filo se ci vuole più di due secondi (tramite una configurazione/richiamo del timer). – ashes999

+6

@ ashes999: Questa è una pessima idea. ** Abortisci una discussione solo se stai pianificando di eliminare l'intero processo. ** Interrompere una discussione dovrebbe essere l'ultima risorsa. L'interruzione di un thread gestito può danneggiare arbitrariamente le strutture dati. –

+0

Grazie mille per tutte le vostre risposte. –

risposta

4

Come sopra .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

Grazie mille per avermi mostrato un esempio. –

6

Impostare la proprietà Timeout del vostro WebRequest oggetto. Documentation

MSDN Esempio:

// 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. Non dimenticare di gestire l'eccezione di timeout quando lo usi. –

2

È possibile utilizzare la proprietà TimeOut su HttpWebRequest

0

considerazione il passaggio al download asincrono dei contenuti. Smetterai di bloccare il thread dell'interfaccia utente e sarai in grado di gestire facilmente più richieste. Sarai in grado di aumentare significativamente il timeout senza impatto sull'interfaccia utente e decidere se ricevere la risposta se desideri comunque recuperare i dati.

12

Due secondi è troppo tempo per bloccare l'interfaccia utente. Dovresti bloccare l'interfaccia utente solo se hai intenzione di ottenere il risultato, diciamo cinquanta millisecondi o meno.

leggere questo articolo su come fare una richiesta Web senza bloccare l'interfaccia utente:

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

Si noti che tutto questo sarà molto più facile in C# 5, che è in versione beta al momento. In C# 5 è sufficiente utilizzare l'operatore await per attendere in modo asincrono il risultato dell'attività. Se volete vedere come questo genere di cose lavorerà in C# 5, vedi:

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

Problemi correlati