2012-04-27 12 views
6

निम्नलिखित प्रोग्राम वेब से कनेक्ट होंगे और "msnbc.com" वेबपृष्ठ की HTML सामग्री प्राप्त करेंगे और परिणाम प्रिंट करेंगे। यदि वेबपृष्ठ से डेटा प्राप्त करने में 2 सेकंड से अधिक समय लगता है, तो मैं चाहता हूं कि मेरी विधि काम करना बंद कर दें और वापस आएं। क्या आप कृपया मुझे बता सकते हैं कि मैं इसे उदाहरण के साथ कैसे कर सकता हूं?सी # यदि किसी विधि को 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); 
    } 
} 
+3

आप शायद निष्पादित एक धागा में लाने, और (धागा गर्भपात अगर यह दो से अधिक सेकंड लेता है करना चाहते हैं एक टाइमर सेटअप/invoke के माध्यम से)। – ashes999

+6

@ ashes999: यह एक बहुत ही बुरा विचार है। ** अगर आप पूरी प्रक्रिया को कम करने की योजना बना रहे हैं तो केवल थ्रेड को रोक दें। ** धागे को छोड़ना अंतिम उपाय होना चाहिए। एक प्रबंधित धागे को छोड़कर मनमाने ढंग से डेटा संरचनाओं को भ्रष्ट कर सकते हैं। –

+0

आपके सभी उत्तरों के लिए बहुत बहुत धन्यवाद। –

उत्तर

4

रूप .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

धन्यवाद उदाहरण के साथ मुझे दिखाने के लिए बहुत कुछ। –

6

अपने WebRequest वस्तु की Timeout संपत्ति सेट करें। Documentation

MSDN उदाहरण:

// 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। इसका उपयोग करते समय टाइमआउट अपवाद को संभालना न भूलें। –

2

आप HttpWebRequest पर TimeOut संपत्ति का उपयोग कर सकते

0

सामग्री के अतुल्यकालिक डाउनलोड करने के लिए परिवर्तित करने पर विचार। आप UI थ्रेड को अवरुद्ध करना बंद कर देंगे और आसानी से एकाधिक अनुरोधों को संभालने में सक्षम होंगे। आप UI पर प्रभाव के बिना समय-समय पर महत्वपूर्ण वृद्धि करने में सक्षम होंगे, और यदि आप अभी भी डेटा प्राप्त करना चाहते हैं तो प्रतिक्रिया प्राप्त करने का निर्णय ले सकते हैं।

12

दो सेकंड ऊपर कहा गया है लंबे समय तक भी यूआई ब्लॉक करने के लिए है। यदि आप परिणाम प्राप्त करने की योजना बना रहे हैं, तो आपको केवल यूआई को अवरुद्ध करना चाहिए, पचास मिलीसेकंड या उससे कम कहें।

यूआई को रोके बिना कैसे एक वेब अनुरोध करने के बारे में यह लेख पढ़ें:

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

ध्यान दें कि यह सब सी # 5, जो वर्तमान में बीटा रिलीज़ में है में बहुत आसान हो जाएगा। सी # 5 में आप आसानी से कार्य के परिणाम की प्रतीक्षा करने के लिए await ऑपरेटर का उपयोग कर सकते हैं। आप देखना चाहते हैं कि बात की इस तरह में काम करेंगे सी # 5 चाहते हैं, तो देखें:

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

संबंधित मुद्दे