在远程许可证服务器上输出lmstat的C#程序

时间:2016-02-22 18:28:59

标签: c# combobox textbox

我正在开发我的第一个C#程序。我创建了一个GUI,您可以在组合框中选择网络许可的软件包,并在文本框(lmutil.exe)中显示许可证使用情况和统计​​信息。

问题在于:首先从组合框中选择,没有任何反应,但是当您从组合框列表中选择另一个软件时,它会从先前选择的软件中输出许可证统计数据。以下是我的代码:

 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;

                }
    }
}

2 个答案:

答案 0 :(得分:1)

不确定你正在使用什么GUI库(Window不是我认识的类,(我使用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何时返回,因为它会挂起一段时间(特别是当端口和/或主机无效时)。

您是否正在处理更改组合框选择的正确事件?

答案 1 :(得分:0)

Process.Start()启动过程,但不等待它完成。您可以在proc.WaitForExit()

之后立即致电string s = proc.StandardOutput.ReadToEnd();