मैं वर्तमान में सी # पर अपना पहला प्रोग्राम लिख रहा हूं और मैं भाषा के लिए बेहद नया हूं (केवल सी के साथ काम करने के लिए उपयोग किया जाता है)। मैंने बहुत सारे शोध किए हैं, लेकिन सभी उत्तरों बहुत सामान्य थे और मैं बस इसे काम नहीं कर सका।किसी अन्य वर्ग में चल रहे किसी अन्य थ्रेड से UI को अपडेट करने के लिए
तो यहां मेरी (बहुत आम) समस्या: मेरे पास एक WPF एप्लिकेशन है जो उपयोगकर्ता द्वारा भरे कुछ टेक्स्टबॉक्स से इनपुट लेता है और फिर उनके साथ बहुत सी गणना करने के लिए इसका उपयोग करता है। उन्हें लगभग 2-3 मिनट लगना चाहिए, इसलिए मैं एक प्रगति पट्टी और एक टेक्स्टब्लॉक को अपडेट करना चाहता हूं जो मुझे बता रहा है कि वर्तमान स्थिति क्या है। इसके अलावा मुझे उपयोगकर्ता से यूआई इनपुट स्टोर करने और उन्हें थ्रेड पर रखने की आवश्यकता है, इसलिए मेरे पास एक तीसरी कक्षा है, जिसका उपयोग मैं ऑब्जेक्ट बनाने के लिए करता हूं और इस ऑब्जेक्ट को पृष्ठभूमि थ्रेड पर पास करना चाहता हूं। जाहिर है, मैं गणना को किसी अन्य थ्रेड में चलाऊंगा, इसलिए यूआई स्थिर नहीं होता है, लेकिन मुझे नहीं पता कि यूआई को कैसे अपडेट किया जाए, क्योंकि सभी गणना विधियां किसी अन्य वर्ग का हिस्सा हैं। बहुत सारे शोध के बाद मुझे लगता है कि साथ जाने का सबसे अच्छा तरीका प्रेषक और टीपीएल का उपयोग करेगा और पृष्ठभूमि कार्यकर्ता नहीं होगा, लेकिन ईमानदारी से मुझे यकीन नहीं है कि वे कैसे काम करते हैं और परीक्षण के लगभग 20 घंटे बाद और अन्य उत्तरों के साथ त्रुटि के बाद, मैंने फैसला किया खुद से एक प्रश्न पूछो।
यहाँ मेरी कार्यक्रम के एक बहुत ही सरल संरचना:
public partial class MainWindow : Window
{
public MainWindow()
{
Initialize Component();
}
private void startCalc(object sender, RoutedEventArgs e)
{
inputValues input = new inputValues();
calcClass calculations = new calcClass();
try
{
input.pota = Convert.ToDouble(aVar.Text);
input.potb = Convert.ToDouble(bVar.Text);
input.potc = Convert.ToDouble(cVar.Text);
input.potd = Convert.ToDouble(dVar.Text);
input.potf = Convert.ToDouble(fVar.Text);
input.potA = Convert.ToDouble(AVar.Text);
input.potB = Convert.ToDouble(BVar.Text);
input.initStart = Convert.ToDouble(initStart.Text);
input.initEnd = Convert.ToDouble(initEnd.Text);
input.inita = Convert.ToDouble(inita.Text);
input.initb = Convert.ToDouble(initb.Text);
input.initc = Convert.ToDouble(initb.Text);
}
catch
{
MessageBox.Show("Some input values are not of the expected Type.", "Wrong Input", MessageBoxButton.OK, MessageBoxImage.Error);
}
Thread calcthread = new Thread(new ParameterizedThreadStart(calculations.testMethod);
calcthread.Start(input);
}
public class inputValues
{
public double pota, potb, potc, potd, potf, potA, potB;
public double initStart, initEnd, inita, initb, initc;
}
public class calcClass
{
public void testmethod(inputValues input)
{
Thread.CurrentThread.Priority = ThreadPriority.Lowest;
int i;
//the input object will be used somehow, but that doesn't matter for my problem
for (i = 0; i < 1000; i++)
{
Thread.Sleep(10);
}
}
}
मैं अगर किसी को कैसे testmethod अंदर से यूआई अद्यतन करने के लिए इसे आसानी से समझा था बहुत आभारी होंगे। चूंकि मैं सी # और ऑब्जेक्ट उन्मुख प्रोग्रामिंग के लिए नया हूं, इसलिए बहुत जटिल उत्तर मैं शायद समझ नहीं पाएगा, हालांकि मैं अपना सर्वश्रेष्ठ प्रदर्शन करूंगा।
अगर किसी के पास सामान्य रूप से बेहतर विचार है (शायद पृष्ठभूमि कार्यकर्ता या कुछ और का उपयोग कर) तो मैं इसे देखने के लिए खुला हूं।
यह एक पुराना और उत्तर दिया गया सवाल है, लेकिन इतना लोकप्रिय है कि मैं इसे किसी भी व्यक्ति के लिए थ्रेड के बीच एक बहुत ही सरल 'प्रगति संवाददाता' को लागू करने के लिए साझा करता हूं। वर्ग प्रगति का उपयोग करें। स्टीफन क्लेरी द्वारा यहां एक अच्छे लेख में कार्यान्वयन का विवरण दिया गया है: http://blog.stephencleary.com/2012/02/reporting-progress-from-async-tasks.html। –
SeanOB