मैं अपने सी # अनुप्रयोग को बहु थ्रेड करने की कोशिश कर रहा हूं क्योंकि कभी-कभी मुझे एक अपवाद मिलता है जो कहता है कि मैंने एक असुरक्षित तरीके से थ्रेड को कॉल किया है। मैंने प्रोग्राम में पहले कभी भी बहु-थ्रेडिंग नहीं की है, इसलिए अगर मैं इस मुद्दे पर अज्ञान महसूस करता हूं तो मेरे साथ सहन करें।विंडोज फॉर्म एप्लिकेशन में मल्टी-थ्रेडिंग कॉल?
मेरे कार्यक्रम का अवलोकन यह है कि मैं प्रदर्शन निगरानी आवेदक बनाना चाहता हूं। यह एक प्रोजेक्ट के प्रोसेसर समय को लॉन्च और मॉनिटर करने के लिए सी # में प्रक्रिया और प्रदर्शन काउंटर क्लास का उपयोग कर रहा है, और उस नंबर को यूआई पर वापस भेज रहा है। हालांकि, वास्तव में प्रदर्शन काउंटर की अगली वैल्यू विधि (जो टाइमर को हर दूसरे धन्यवाद करने के लिए सेट है) को कॉल करने वाली विधि में, मुझे कभी-कभी उपर्युक्त अपवाद मिलता है जो किसी थ्रेड को असुरक्षित तरीके से कॉल करने के बारे में बात करेगा।
मैंने आपके आकलन के लिए कुछ कोड संलग्न किए हैं। मुझे पता है कि यह एक समय लेने वाला सवाल है, इसलिए मैं वास्तव में आभारी हूं अगर कोई मुझे कोई नया थ्रेड बनाने और सुरक्षित तरीके से कॉल करने के तरीके के बारे में कोई मदद दे सकता है। मैंने एमएसडीएन पर क्या हो रहा था, यह देखने की कोशिश की, लेकिन यह मुझे थोड़ी उलझन में डाल दिया।
private void runBtn_Click(object sender, EventArgs e)
{
// this is called when the user tells the program to launch the desired program and
// monitor it's CPU usage.
// sets up the process and performance counter
m.runAndMonitorApplication();
// Create a new timer that runs every second, and gets CPU readings.
crntTimer = new System.Timers.Timer();
crntTimer.Interval = 1000;
crntTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
crntTimer.Enabled = true;
}
private void OnTimedEvent(object source, ElapsedEventArgs e)
{
// get the current processor time reading
float cpuReading = m.getCPUValue();
// update the current cpu label
crntreadingslbl.Text = cpuReading.ToString(); //
}
// runs the application
public void runAndMonitorApplication()
{
p = new Process();
p.StartInfo.UseShellExecute = true;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.FileName = fileName;
p.Start();
pc = new System.Diagnostics.PerformanceCounter("Process",
"% Processor Time",
p.ProcessName,
true);
}
// This returns the current percentage of CPU utilization for the process
public float getCPUValue()
{
float usage = pc.NextValue();
return usage;
}
ठीक है, यह और पृष्ठभूमि कार्यकर्ता टिप्पणी बहुत उपयोगी प्रतीत; लेकिन जैसा कि मैं इसे समझता हूं, प्रक्रिया यूआई थ्रेड पर चल रही है, लेकिन मुझे उस प्रक्रिया पर डेटा एकत्र करने और अपडेट करने के लिए एक अलग धागा बनाना है? आम तौर पर, मैं कैसे कह सकता हूं कि अलग धागा कहां बनाना है? – Waffles
टाइमर "उपलब्ध हो जाता है" जब टाइमर पहले उपलब्ध थ्रेडपूल थ्रेड पर अनुरोधित ElapsedEventHandler प्रतिनिधि को निष्पादित करेगा। तो जो कुछ भी आपने टाइमर से करने के लिए कहा वह यूआई थ्रेड पर नहीं, अलग थ्रेड पर होगा। पृष्ठभूमि कार्यकर्ता जोड़ना समीकरण में अभी तक एक और धागा पेश करेगा। –