c#从控制台运行windows窗体并运行它们

时间:2016-06-11 15:48:02

标签: c# forms winforms multiple-instances

有一个控制台应用程序可以模拟路由器功能(数据包切换等)。我制作了一个简单的Windows窗体,它应该显示每个路由器的套接字使用了多少。每个插座都有不同的容量,每个Form"连接"套接字应显示仍有多少容量可用。

到目前为止我的代码:

static void Main(string[] args)
        {
        //get number of router's sockets
        args = Environment.GetCommandLineArgs();
        int socketnumber = Convert.ToInt32(args[2]);
        //get sockets' capacity
        int[] array = new int[socketnumber];
        for (int i = 0; i < socketnumber; i++)
        {
            array[i] = Convert.ToInt32(args[3 + i]);
        }

现在,LRM是一个WinForm,它显示每个套接字(或更确切地说,链接附加到套接字)状态,因此我初始化它并为其提供参数。

            LRM[] lrm = new LRM[socketnumber];

            for (int i = 0; i < socketnumber; i++)
            {
                lrm[i] = new LRM();
                lrm[i].Show();
                a++;
            }

            for (int i = 0; i < socketnumber; i++)
            {
                Console.WriteLine(array[i]);
                lrm[i].capacity = array[i];
                lrm[i].available = array[i];
                lrm[i].WriteCapacity(lrm[i].capacity);
                lrm[i].WriteAvailable(lrm[i].available);
            }

WriteCapacity和WriteAvailable是路由器调用以更新LRM上的值的方法,如下所示:

    public void WriteAvailable(int ava)
    {
    MethodInvoker mi = delegate ()
       {
        textBox2.Text = ava.ToString();
       };
    Invoke(mi);
    }

现在,我遇到了当前的问题:

1)从控制台运行多个窗体并保持其功能(所有窗口同时),当窗体数量变化时(由命令行参数设置)

2)更新LRM值。当使用show()方法时,它只显示表单,它不会给它任何值,并且很快在表单停止响应后,给出窗口错误。使用Application.Run()方法时,一个表单运行良好,但其他LRM和路由器的控制台都无法运行。

1 个答案:

答案 0 :(得分:-1)

我很欣赏Alexander Petrov的回答,但我找到了解决问题的方法。

我试过Thread方法。首先,我将大部分变量设为静态:

    static int[] array;
    static LRM[] lrm;
    static int port;

然后我制作了将作为线程启动方法的方法

    private static void startLRM(int i)
    {
        Console.WriteLine(i);
        lrm[i].Text = "LRM R" + ((port / 10) - 120).ToString() + " S" + a.ToString();
        a++;

        Console.WriteLine(array[i]);
        lrm[i].capacity = array[i];
        lrm[i].available = array[i];
        lrm[i].WriteCapacity(lrm[i].capacity);
        lrm[i].WriteAvailable(lrm[i].available);
        lrm[i].ShowDialog();
    }

然后,在Main()方法中,我为链接资源管理器分配了内存,在for循环中,我根据需要创建了多个LRM。

        lrm = new LRM[socketnumber];

        for (int i = 0; i < socketnumber; i++)
        {
        lrm[i] = new LRM();
        Thread thread = new Thread(() => startLRM(i));
        thread.Start();
        Thread.Sleep(150);
        }

睡觉实际上是必要的,因为出于不明原因,当它不存在时我会遇到错误。

最后,我得到了我需要的东西 - 一个控制台应用程序,它可以显示正在发生的事情,还有一些窗体以很好的方式显示一些值。