c#Texbox在其文本从另一个线程

时间:2017-07-24 20:56:08

标签: c# multithreading textbox

应用程序说明:我的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;
    }

2 个答案:

答案 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;
    }
}