实时更新 GUI
Posted
技术标签:
【中文标题】实时更新 GUI【英文标题】:Update GUI in realtime 【发布时间】:2015-09-17 09:35:18 【问题描述】:我正在使用 SharpSSH 将命令从 windows 窗体发送到一台 linux 机器。 一切都按预期工作,只是我无法实时更新输出。命令执行完成后会出现输出。如何在输出发生时更新输出。
这是我作为后台工作者运行的代码。
private void execute_green_DoWork(object sender, DoWorkEventArgs e)
List<object> argumentList = e.Argument as List<object>;
string isp_username = (string)argumentList[0];
string isp_password = (string)argumentList[1];
string ssid = (string)argumentList[2];
string stdOut = null;
string stdError = null;
string address = "192.168.1.100";
string start = "Connecting...";
this.Invoke(new MethodInvoker(delegate progressWindow.green_update(start); ));
System.Threading.Thread.Sleep(200);
string user = "user";
string pass = "password";
string status = "Connected.....";
this.Invoke(new MethodInvoker(delegate progressWindow.green_update(status); ));
System.Threading.Thread.Sleep(200);
this.Invoke(new MethodInvoker(delegate progressWindow.green_update("Programming....."); ));
SshExec ssh_green = new SshExec(address, user, pass);
ssh_green.Connect();
ssh_green.RunCommand("cfg_green " + isp_username + " " + isp_password + " " + ssid, ref stdOut, ref stdError);
output_green = stdOut;
ssh_green.Close();
在上面的 output_green 被渲染到richtextbox。 熟悉SharpSSH的人,请指导一下。
【问题讨论】:
没有理由否决这个问题。请版主看看这个。这是一个真正的问题。 【参考方案1】:这是使用同步上下文来更新 Form 的 lblTimer 标签:
CS:
public partial class MainForm : Form
private readonly SynchronizationContext _context;
public MainForm()
InitializeComponent();
// the context of MainForm, main UI thread
// 1 Application has 1 main UI thread
_context = SynchronizationContext.Current;
private void BtnRunAnotherThreadClick(object sender, EventArgs e)
Task.Run(() =>
while (true)
Thread.Sleep(1000);
//lblTimer.Text = DateTime.Now.ToLongTimeString(); // no work
UpdateTimerInMainThread(); // work
);
private void UpdateTimerInMainThread()
//SynchronizationContext.Current, here, is context of running thread (Task)
_context.Post(SetTimer, DateTime.Now.ToLongTimeString());
public void SetTimer(object content)
lblTimer.Text = (string)content;
希望对您有所帮助。
【讨论】:
以上是关于实时更新 GUI的主要内容,如果未能解决你的问题,请参考以下文章