Tôi đang cố gắng làm cho ứng dụng C# của tôi đa luồng bởi vì đôi khi, tôi nhận được một ngoại lệ cho biết tôi đã thực hiện cuộc gọi đến một chuỗi theo cách không an toàn. Tôi đã không bao giờ thực hiện bất kỳ đa luồng trước khi trong một chương trình, vì vậy chịu với tôi nếu tôi âm thanh kinda dốt nát về vấn đề này.Cuộc gọi đa luồng trong ứng dụng Windows Forms?
Tổng quan về chương trình của tôi là tôi muốn tạo một ứng dụng giám sát hiệu suất. Điều này đòi hỏi phải sử dụng lớp truy cập quy trình và hiệu năng trong C# để khởi động và theo dõi thời gian xử lý của ứng dụng và gửi số đó trở lại giao diện người dùng. Tuy nhiên, trong phương thức thực sự gọi phương thức nextValue của bộ đếm hiệu suất (được thiết lập để thực hiện mỗi giây nhờ một bộ đếm thời gian), đôi khi tôi sẽ nhận được ngoại lệ nói trên mà sẽ nói về việc gọi một luồng không an toàn.
Tôi đã đính kèm một số mã cho sự nhìn chăm chú của bạn. Tôi biết đây là một câu hỏi tiêu tốn thời gian, vì vậy tôi sẽ rất biết ơn nếu có ai có thể giúp tôi bất cứ nơi nào để tạo ra một sợi chỉ mới và cách gọi nó một cách an toàn. Tôi đã cố gắng nhìn vào những gì đã được lên trên MSDN, nhưng điều đó chỉ kinda nhầm lẫn tôi.
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;
}
Được rồi, đây và nhận xét công nhân nền dường như khá hữu ích; nhưng như tôi đã hiểu, bản thân quy trình đang chạy trên chuỗi giao diện người dùng, nhưng tôi phải tạo một luồng riêng để thu thập và cập nhật dữ liệu về quy trình đó? Nói chung, làm thế nào tôi sẽ có thể cho biết nơi để làm cho một chủ đề riêng biệt? – Waffles
Bộ hẹn giờ sẽ thực hiện ủy nhiệm ElapsedEventHandler được yêu cầu trên luồng ThreadPool đầu tiên có sẵn khi bộ hẹn giờ "tắt". Vì vậy, bất cứ điều gì bạn yêu cầu bộ đếm thời gian để làm sẽ xảy ra trên một chủ đề riêng biệt, không phải trên thread UI. Thêm một nhân viên nền sẽ chỉ giới thiệu một chủ đề khác cho phương trình. –