繁体   English   中英

如何以 windows 形式可视化来自 c# 控制台应用程序的数据?

[英]How to visualize the data from c# console app in windows form?

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

Window 用某种按钮打开。 所以,obj 不是 null。 但是这个按钮是白色的。 表单在 5 秒后关闭。 可能是什么问题?

记得直到你的应用程序还活着吗? 除非您的应用程序中至少有 1 个前台线程。

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

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

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

另一个注意事项是您没有在 UI 线程中设置单元。 在这里阅读更多黑客是什么。 请致电t.SetApartmentState(ApartmentState.STA); 在调用Start()之前。 另一种选择是使用STAThreadAttribute标记您的Main()并按照我在Main()方法中描述的那样运行您的表单。

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

这会给你一个这样的主要方法:

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

正如sander 上面所说的,您的代码似乎正在按照您的预期进行,即打开、休眠5 秒并结束。 我想您已经在基本的控制台应用程序中看到了相同的行为,并通过使用Console.ReadLine()解决了它......在某种意义上同样适用于此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM