如何在windows窗体中可视化c#控制台应用程序中的数据?

如何在windows窗体中可视化c#控制台应用程序中的数据?,c#,.net,winforms,C#,.net,Winforms,我从UDP端口获取数据,在控制台中显示数据没有问题。我在尝试将此数据发送到Windows窗体并在其中使用时遇到问题。这是我的密码: using System; using System.Drawing; using System.Net; using System.Net.Sockets; using System.Threading; using System.Windows.Forms; namespace ConsoleApp2 { class Program {

我从UDP端口获取数据,在控制台中显示数据没有问题。我在尝试将此数据发送到Windows窗体并在其中使用时遇到问题。这是我的密码:

using System;
using System.Drawing;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Windows.Forms;

namespace ConsoleApp2 {
    class Program {
        static void Main(string[] args) {
            Console.WriteLine();
            Thread t = new Thread(FormDrawing);
            t.Start(UDPListener());
        }

        // Listening Port
        static byte[] UDPListener() {
            Console.WriteLine("Waiting for client");
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 162);
            EndPoint ep = (EndPoint)ipep;
            socket.Bind(ep);
            socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 0);
            byte[] indata = new byte[1024];
            IPEndPoint peer = new IPEndPoint(IPAddress.Any, 0);
            EndPoint inep = (EndPoint)peer;
            int inlen = socket.ReceiveFrom(indata, ref inep);
            socket.Close();
            Console.WriteLine(indata.ToString());
            return indata;
        }

        // Drawing Form
        static void FormDrawing(object ob) {
            byte[] obj = (byte[])ob;
            Form mainForm = new Form();
            if (obj != null) {
                Button MS2 = new Button {
                    Location = new Point(0, 0),
                    Size = new Size(80, 80),
                    Text = obj.ToString(),
                    BackColor = Color.Green
                };
                mainForm.Controls.Add(MS2);
            }
            mainForm.Show();
            Thread.Sleep(5000);
        }
    }
}

窗口会用某种按钮打开。因此,obj不是空的。但是这个按钮是白色的。表单在5秒后关闭。问题出在哪里?

最简单的方法可能是确保已安装最新的dotnet核心版本,然后从命令行执行
dotnet new winforms
,并将该项目用作起点

这将为您提供如下主要方法:

[STAThread]
静态void Main()
{
Application.SetHighDpiMode(HighDpiMode.SystemAware);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(新Form1());
}

正如sander在上面所说的,您的代码似乎正在按照您预期的方式运行,即打开、休眠5秒然后结束。我想你已经在一个基本的控制台应用程序中看到了同样的行为,并通过使用
console.ReadLine()
。。。从某种意义上讲,这里也是如此。

还记得你的应用程序还活着吗?除非应用程序中至少有一个前台线程

启动应用程序时,主线程进入
main()
method。它从套接字获取字节,并启动一个新线程,将这些字节作为参数传递。然后主线程退出,但在创建线程时,应用程序仍然可以工作。新线程创建表单并显示它,但它不会初始化消息调度循环,这就是为什么表单没有完全呈现并表现为一个处理应用程序-它只是不处理来自用户的任何消息(鼠标悬停、单击、拖动等)。同时,你冻结一个线程5秒钟,然后它退出,你的应用程序被关闭

所以这里没有问题,没有魔法,一切都是确定性的,完全按照您编程的方式工作:)

尝试使用
Application.Run(mainForm)
mainForm.ShowDialog()
而不是
mainForm.Show()
。这些方法将启动应用程序消息传递循环,您将看到表单被打开,直到您关闭它。阅读有关应用程序消息传递循环的更多信息


另一个注意事项是,您不需要在UI线程中添加。阅读更多关于那是什么的文章。请致电
t.SetApartmentState(ApartmentState.STA)在调用
Start()
之前。另一个选项是使用
STAThreadAttribute
标记
Main()
,并按照我在
Main()
方法中所述的方式运行表单。

你好,马克,我不确定你想做什么,但在我看来,你的应用程序按照你编写的方式执行了所有代码,然后按它应该的方式停止。没有任何东西可以让你的应用程序保持活动状态。你的主应用程序是控制台还是Winforms?首先,这是控制台应用程序,只需控制台和无限循环的UDPListener()就可以正常工作。我正在尝试在Windows窗体中显示来自端口的数据您需要启动一个新的窗体项目并将代码添加到其中。是否继续在FormDrawing窗口中显示更新的数据?还是你只想展示一次?