में यूआई को एक्सेस करते समय मैं एक यूआई संपत्ति को बदलने की कोशिश (विशेष रूप से सक्षम) मेरी धागा System.Threading.ThreadAbortExceptionएक धागा
कैसे मैं एक थ्रेड में यूआई का उपयोग कर फेंकता है।
में यूआई को एक्सेस करते समय मैं एक यूआई संपत्ति को बदलने की कोशिश (विशेष रूप से सक्षम) मेरी धागा System.Threading.ThreadAbortExceptionएक धागा
कैसे मैं एक थ्रेड में यूआई का उपयोग कर फेंकता है।
आप एक BackgroundWorker इस्तेमाल कर सकते हैं और फिर इस तरह यूआई बदलने के लिए: आप सी # 3.5 का उपयोग कर रहे हैं, तो
control.Invoke((MethodInvoker)delegate {
control.Enabled = true;
});
मैन्युअल थैड सिंक्रनाइज़ेशन इम्प्लेमेनेशन के बजाय विन फॉर्म की पृष्ठभूमिवर्कर कक्षा का उपयोग करने के बारे में कैसे?
मुझे लगता है कि हम यहां WinForms से बात कर रहे हैं? आपको इसे प्रबंधित करने वाला एक धागा होना चाहिए - धागा जिसने प्रश्न में नियंत्रण बनाया है। यदि आप इसे एक अलग थ्रेड से करना चाहते हैं, जिसे आप Control.InvokeRequired का उपयोग करके पता लगा सकते हैं, तो आपको इसे सही थ्रेड पर marshall करने के लिए Control.Invoke विधि का उपयोग करना चाहिए। Google ऐसा करने में कुछ सामान्य पैटर्न के लिए संपत्ति और विधि (क्रमशः)।
आप प्रारंभिक रूप से BeginInvoke() के साथ-साथ अधिकांश मामलों में भी सुरक्षित रूप से उपयोग कर सकते हैं जब तक कि आप किसी भी फेंकने वाले अपवाद को वापस आने वाले थ्रेड में मार्शल करना नहीं चाहते हैं। – Quibblesome
'InvokeRequired/BeginInvoke' बहुत शब्दशः है, आईएमओ। –
यूआई थ्रेड पर मार्शल कॉल करने के लिए SynchronizationContext
का उपयोग करें यदि आप यूआई को संशोधित करना चाहते हैं, जबकि आप गैर-यूआई थ्रेड अभी भी चल रहे हैं। अन्यथा, BackgroundWorker
का उपयोग करें।
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();
}
}
, यह विस्तार के तरीकों और 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");
बिल्कुल मेरे पास सबसे आसान तरीका आया है, और मैंने यूआई अद्यतन थ्रेड समाधानों की भीड़ की कोशिश की है। मेरा अप वोट मिला। – GONeale
आप कम से कम पाठ का उपयोग करने के लिए और सबसे स्पष्ट उदाहरण/स्पष्टीकरण दिखाने के लिए जीतते हैं। Kudos –
धन्यवाद मेरे समय से बचने का सबसे आसान तरीका। – Tirth