[英]How to use a WinRT component in c# console(windows form) app?
[英]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.