在另一个线程运行WPF时更新文本框

时间:2011-10-21 08:48:45

标签: c# wpf thread-safety

这是我的应用程序的架构。我有一个Perl脚本,使用下面的方法单击一个按钮调用。

        ProcessStartInfo psStartInfo = new ProcessStartInfo("perl.exe");
        psStartInfo.Arguments = paramStr;
        psStartInfo.UseShellExecute = false;
        psStartInfo.RedirectStandardOutput = true;
        psStartInfo.RedirectStandardError = true;
        psStartInfo.CreateNoWindow = false;


        ps.StartInfo = psStartInfo;
        ps.Start();
        string os = ps.StandardOutput.ReadToEnd();

上述代码执行成功。有一个文本文件是使用我在上面提到的代码中触发的Perl脚本生成的。我必须阅读该文件并在我的WPF文本框中显示其中的所有内容。 Perl文件每隔5到10秒更新一次。我使用下面提到的代码来读取文件并将其显示在我的文本框中。

        dispatcherTimer = new DispatcherTimer();
        dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
        dispatcherTimer.Interval = new TimeSpan(0, 0, 30);
        dispatcherTimer.Start();

     private void dispatcherTimer_Tick(object sender, EventArgs e)
    {
        txtExecLog.Text = "";

        if (File.Exists("C:\\FlashAuto\\Execution_Logs\\log.txt"))
        {
            File.Copy("C:\\FlashAuto\\Execution_Logs\\log.txt", "C:\\FlashAuto\\Temp\\log.txt", true);
            TextReader readLogs = new StreamReader("C:\\FlashAuto\\Temp\\log.txt");
            string line = readLogs.ReadLine();
            while (line != null)
            {
                txtExecLog.Text += "\n" + line;
                line = readLogs.ReadLine();
                txtExecLog.ScrollToEnd();
            }

            CountLines = txtExecLog.LineCount - 1;
            readLogs.Close();
            // Forcing the CommandManager to raise the RequerySuggested event
            txtExecLog.ScrollToEnd();
            CommandManager.InvalidateRequerySuggested();
            readLogs.Dispose();
        }
        else
        {
            txtExecLog.Text += "log file not found at: "+DateTime.Now.ToString();
        }

    }

问题在于:

读取和写入文本框已成功完成,但是我的应用程序占用了大量内存。如果我禁用日志记录,则内存使用情况是最佳的。

0 个答案:

没有答案