2013-04-07 4 views
5

लागू क्यों यूआई पाठ बॉक्स के दौरान जमा अलग धागायूआई धागा पाठ बॉक्स

private void button1_Click(object sender, EventArgs e) 
    { 
     Thread t1 = new Thread(DoStuff); 
     t1.Start(); 
    } 

    void DoStuff() 
    { 
     using (var wc = new System.Net.WebClient()) 
     { 
      string page_src = wc.DownloadString("http://bing.com"); 
      textBox1.Invoke((MethodInvoker)delegate() { textBox1.Text = page_src; }); // freezes while textbox text is changing 
     } 
    } 

इस बीच BackgroundWorker पूरी तरह से काम करता है से लागू दौरान जमा - यूआई

private void button1_Click(object sender, EventArgs e) 
    { 
     BackgroundWorker bw1 = new BackgroundWorker(); 
     bw1.DoWork += (a, b) => { DoStuff(); }; 
     bw1.RunWorkerAsync(); 
    } 

    void DoStuff() 
    { 
     using (var wc = new System.Net.WebClient()) 
     { 
      string res = wc.DownloadString("http://bing.com"); 
      textBox1.Invoke((MethodInvoker)delegate() { textBox1.Text = res; }); // works great 
     } 
    } 
+0

यदि आप इसे शुरू करने से पहले 't1.SetApartmentState (ApartmentState.STA)' करते हैं तो क्या होता है? –

+0

अभी भी वही। बीटीडब्ल्यू यूआई केवल कुछ सौ मिलीसेकंड –

+1

के लिए फ्रीज करता है आपको वास्तव में सिंक्रोनस इनकोक की आवश्यकता नहीं होती है, यूआई के लिए आप केवल BeginInvoke को कॉल करने के लिए स्वतंत्र हैं। इसके अलावा एक छोटा पाठ सेट करने का प्रयास करें। शायद यह एक मानक टेक्स्टबॉक्स –

उत्तर

1

आह्वान की वजह से नहीं है यही कारण है कि जमता नहीं। आपका यूआई कतार भर गई है, और यह हो सकता है क्योंकि:

  1. आप DoStuff() अक्सर बुला रहे हैं
  2. आप यूआई पर अन्य भारी नौकरियों कर रहे हैं

अद्यतन: के अनुसार

हटाए गए टिप्पणी टेक्स्ट बॉक्स में 50K टेक्स्ट डालकर समस्या का स्रोत था। एक स्मार्ट टेक्स्ट बॉक्स का उपयोग करने पर विचार करें जो मांग पर डेटा लोड करता है। वहां एक तैयार होना चाहिए।

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