2009-04-02 17 views
7

में यूआई को एक्सेस करते समय मैं एक यूआई संपत्ति को बदलने की कोशिश (विशेष रूप से सक्षम) मेरी धागा System.Threading.ThreadAbortExceptionएक धागा

कैसे मैं एक थ्रेड में यूआई का उपयोग कर फेंकता है।

उत्तर

15

आप एक BackgroundWorker इस्तेमाल कर सकते हैं और फिर इस तरह यूआई बदलने के लिए: आप सी # 3.5 का उपयोग कर रहे हैं, तो

control.Invoke((MethodInvoker)delegate { 
    control.Enabled = true; 
}); 
+0

बिल्कुल मेरे पास सबसे आसान तरीका आया है, और मैंने यूआई अद्यतन थ्रेड समाधानों की भीड़ की कोशिश की है। मेरा अप वोट मिला। – GONeale

+0

आप कम से कम पाठ का उपयोग करने के लिए और सबसे स्पष्ट उदाहरण/स्पष्टीकरण दिखाने के लिए जीतते हैं। Kudos –

+0

धन्यवाद मेरे समय से बचने का सबसे आसान तरीका। – Tirth

1

मैन्युअल थैड सिंक्रनाइज़ेशन इम्प्लेमेनेशन के बजाय विन फॉर्म की पृष्ठभूमिवर्कर कक्षा का उपयोग करने के बारे में कैसे?

3

मुझे लगता है कि हम यहां WinForms से बात कर रहे हैं? आपको इसे प्रबंधित करने वाला एक धागा होना चाहिए - धागा जिसने प्रश्न में नियंत्रण बनाया है। यदि आप इसे एक अलग थ्रेड से करना चाहते हैं, जिसे आप Control.InvokeRequired का उपयोग करके पता लगा सकते हैं, तो आपको इसे सही थ्रेड पर marshall करने के लिए Control.Invoke विधि का उपयोग करना चाहिए। Google ऐसा करने में कुछ सामान्य पैटर्न के लिए संपत्ति और विधि (क्रमशः)।

+0

आप प्रारंभिक रूप से BeginInvoke() के साथ-साथ अधिकांश मामलों में भी सुरक्षित रूप से उपयोग कर सकते हैं जब तक कि आप किसी भी फेंकने वाले अपवाद को वापस आने वाले थ्रेड में मार्शल करना नहीं चाहते हैं। – Quibblesome

+0

'InvokeRequired/BeginInvoke' बहुत शब्दशः है, आईएमओ। –

1

यूआई थ्रेड पर मार्शल कॉल करने के लिए SynchronizationContext का उपयोग करें यदि आप यूआई को संशोधित करना चाहते हैं, जबकि आप गैर-यूआई थ्रेड अभी भी चल रहे हैं। अन्यथा, BackgroundWorker का उपयोग करें।

1
void button1_Click(object sender, EventArgs e) { 
    var thread = new Thread(ParalelMethod); 
    thread.Start("hello world"); 
} 
void ParalelMethod(object arg) { 
    if (this.InvokeRequired) { 
     Action<object> dlg = ParalelMethod; 
     this.Invoke(dlg, arg); 
    } 
    else { 
     this.button1.Text = arg.ToString(); 
    } 
} 
6

, यह विस्तार के तरीकों और lambdas उपयोग करने के लिए से यूआई अद्यतन करने को रोकने के लिए वास्तव में आसान है अन्य धागे

public static class FormExtensions 
{ 
    public static void InvokeEx<T>(this T @this, Action<T> action) where T : Form 
    { 
    if (@this.InvokeRequired) 
    { 
     @this.Invoke(action, @this); 
    } 
    else 
    { 
     action(@this); 
    } 
    } 
} 

तो अब आप किसी भी रूप पर InvokeEx का उपयोग करें और किसी भी गुण है कि Form का हिस्सा नहीं हैं/क्षेत्रों उपयोग करने में सक्षम हो सकता है।

this.InvokeEx(f => f.label1.Text = "Hello"); 
संबंधित मुद्दे