簡體   English   中英

c#從控制台運行Windows窗體並運行它們

[英]c# run windows form from console and run both of them

有一個控制台應用程序可模擬路由器功能(數據包切換等)。 我制作了一個簡單的Windows窗體,該窗體應顯示每個路由器的套接字使用了多少。 每個套接字具有不同的容量,並且每個“已連接”到套接字的表格都應顯示仍有多少容量。

到目前為止,我的代碼:

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)當Windows窗體的數量發生變化(由命令行參數設置)時,從控制台運行多個Windows窗體並維護其功能(同時執行所有功能)

2)更新LRM值。 當使用show()方法時,它僅顯示表單,它不提供任何值,並且在表單停止響應后不久,出現Windows錯誤。 當使用Application.Run()方法時,一種形式可以很好地運行,但是其他LRM和路由器的控制台都無法工作。

我感謝亞歷山大·彼得羅夫(Alexander Petrov)的回答,但我找到了解決問題的方法。

我嘗試了線程方法。 首先,我將大多數變量設為靜態:

    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);
        }

睡覺實際上是必要的,因為由於未知的原因,當我不在時會出現錯誤。

最終,我得到了我需要的-一個控制台應用程序,它顯示了正在發生的事情,以及幾個以漂亮的方式顯示一些值的Windows窗體。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM