应用程序说明:我的application显示正在运行的进程的列表,当您click进行处理时,它应显示有关文本框的一些数据。
问题:我试图通过使用委托功能从另一个线程更新文本框。当我运行我的应用程序并选择第一个进程时,一切都在文本框中正确显示,但是当我选择第二个进程时,第三个等等,文本框也开始显示“旧”数据(来自先前点击过程的数据)。
它就像我存储的数据来自某些数组或堆栈中的每个单击进程,然后在文本框中显示它真的很快。例如:如果我点击使用50 mb ram的进程chrome.exe,我的文本框将显示“50 mb”,如果我点击之后使用5 mb的进程calculator.exe,我的texbox将显示“50 mb”并且在“5mb”之后几秒,并且它将一直重复这一点。 / p>
点击时执行的代码:
private void Lista_procesa_prikaz_MouseClick(object sender, MouseEventArgs e)
{
refresh = true;
RamTextBox.Text = CpuTextBox.Text = Description_textbox.Text = "";
var proc = System.Diagnostics.Process.GetProcessById(Int32.Parse(Lista_procesa_prikaz.Items[Lista_procesa_prikaz.FocusedItem.Index].SubItems[1].Text));
ThreadRefresh = new Thread(() => ProcesKlik(proc));
ThreadRefresh.IsBackground = true;
ThreadRefresh.Start();
}
ProcesKlik线程:
private void ProcesKlik(Process proc)
{
do
{
try
{
PerformanceCounter CpuCounter = new PerformanceCounter("Process", "% Processor Time", proc.ProcessName);
CpuCounter.NextValue();
Thread.Sleep(2000);
float postotak = (float)CpuCounter.NextValue() / cpucount;
TextBoxChange(CpuTextBox, "Processor usage:" + postotak.ToString("n1") + "%");
bytesTo Mb = new bytesTo(proc.WorkingSet64);
TextBoxChange(RamTextBox,"Ram usage:" + Mb.ToMb().ToString() + "Mb");
}
catch(InvalidOperationException)
{
refresh = false;
MessageBox.Show("Process is terminated.");
}
}
while (refresh);
}
TextBoxChange委托函数,用于更改另一个线程的文本框内容:
delegate void TextBoxChangeCallback(TextBox textbox, string text);
private void TextBoxChange (TextBox textbox,string text)
{
if (textbox.InvokeRequired)
{
TextBoxChangeCallback deg = new TextBoxChangeCallback(TextBoxChange);
this.Invoke(deg, new object[] { textbox, text });
}
else
textbox.Text = text;
}
答案 0 :(得分:0)
问题是,就像Sam Axe在评论中提到的那样,我从未停止过运行线程,所以"显示旧数据"实际上是仍在运行的线程并将数据写入文本框。我通过使用flags(布尔变量)在开始新线程之前停止线程来解决我的问题。
答案 1 :(得分:-1)
尝试将代码更改为:
private void TextBoxChange (TextBox textbox,string text)
{
if (this.InvokeRequired)
{
this.Invoke(new MethodInvoker(() => this.TextBoxChange(textbox, text);
return;
}
}