C# 在远程许可证服务器上输出lmstat的C程序
我正在编写我的第一个C程序。我已经创建了一个GUI,您可以在组合框中选择网络许可软件包,它在文本框lmutil.exe中显示许可使用情况和统计信息 问题是:在第一次从组合框中选择时,什么都不会发生,但是当您从组合框列表中选择另一个软件时,它会输出以前选择的软件的许可证统计信息。以下是我的代码:C# 在远程许可证服务器上输出lmstat的C程序,c#,combobox,textbox,C#,Combobox,Textbox,我正在编写我的第一个C程序。我已经创建了一个GUI,您可以在组合框中选择网络许可软件包,它在文本框lmutil.exe中显示许可使用情况和统计信息 问题是:在第一次从组合框中选择时,什么都不会发生,但是当您从组合框列表中选择另一个软件时,它会输出以前选择的软件的许可证统计信息。以下是我的代码: public partial class MainWindow : Window { public MainWindow() { InitializeComponent
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void ComboBoxItem_Selected(object sender, RoutedEventArgs e)
{
if (ComboBox1.Text == "ComboItem1")
{
Process proc = new Process();
proc.StartInfo.FileName = "lmutil.exe";
proc.StartInfo.Arguments = "lmstat -a -c port@host";
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.CreateNoWindow = true;
// start the process
proc.Start();
string s = proc.StandardOutput.ReadToEnd();
TextBox1.Text = s;
}
else
{
if (ComboBox1.Text == "ComboItem2")
{
Process proc = new Process();
proc.StartInfo.FileName = "lmutil.exe";
proc.StartInfo.Arguments = "lmstat -a -c port@host";
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.CreateNoWindow = true;
// start the process
proc.Start();
string s = proc.StandardOutput.ReadToEnd();
TextBox1.Text = s;
}
else
{
if (ComboBox1.Text == "ComboItem3")
{
Process proc = new Process();
proc.StartInfo.FileName = "lmutil.exe";
proc.StartInfo.Arguments = "lmstat -a -c port@host";
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.CreateNoWindow = true;
// start the process
proc.Start();
string s = proc.StandardOutput.ReadToEnd();
TextBox1.Text = s;
}
}
}
进程。启动启动进程,但不等待它完成。您可以在字符串s=proc.StandardOutput.ReadToEnd之后立即调用proc.WaitForExit 不确定您使用的GUI库Windows不是我识别的类,我使用WinForms,但以下内容似乎适用于我,用真实的端口和主机名替换了我只有一个许可证服务器要测试的三个项目之一
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
private void comboBox1_SelectedIndexChanged(Object sender, EventArgs e){
switch (this.comboBox1.Text){
case "item1":
this.textBox1.Text = this.getLMStat(158, "ONE");
MessageBox.Show("DONE");
break;
case "item2":
this.textBox1.Text = this.getLMStat(158, "TWO");
MessageBox.Show("DONE");
break;
case "item3":
this.textBox1.Text = this.getLMStat(158, "THREE");
MessageBox.Show("DONE");
break;
default:
MessageBox.Show("Unsupported Value");
break;
}
}
private String getLMStat(int port, String server){
try {
Process proc = new Process();
proc.StartInfo.FileName = "lmutil.exe";
proc.StartInfo.Arguments = "lmstat -a -c " + port + "@" + server;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.CreateNoWindow = true;
// start the process
proc.Start();
return proc.StandardOutput.ReadToEnd();
}
catch (Exception){return "Do something with Exception";}
}
}
消息框在那里,这样您就可以知道lmstat何时返回,因为它会挂起一段时间,特别是当端口和/或主机无效时
您是否正在处理组合框选择更改的正确事件?实际上,这在这里没有问题,因为ReadToEnd将按照名称所示一直读取,直到到达流的末尾,也就是说,每当流关闭和/或进程终止时。这对我来说仍然不起作用。有人有什么想法吗?