为啥它不起作用,控制台程序转换为 Windows Form C# [关闭]

Posted

技术标签:

【中文标题】为啥它不起作用,控制台程序转换为 Windows Form C# [关闭]【英文标题】:Why it doesn't work, The Console program converts to Windows Form C # [closed]为什么它不起作用,控制台程序转换为 Windows Form C# [关闭] 【发布时间】:2022-01-20 13:44:17 【问题描述】:

我有一个程序可以在 UDP 之后从游戏中读取遥测数据;在控制台版本中,它可以完美运行。我想制作一个 Windows 窗体版本,但我不知道如何强制它工作。从理论上讲,我认为它应该有效。 对不起,也许是一个微不足道的问题;我是初学者。

控制台程序:

namespace F12021

    class Program
    
        static void Main(string[] args)
        
            F12020TelemetryClient client = new F12020TelemetryClient(20777);
            client.OnCarTelemetryDataReceive += TelemetryUpdate;

            client.OnConnectStatusChanged += OnConnectStatusChange;
            Console.CursorVisible = false;
            Console.Read();
        

        private static void OnConnectStatusChange(bool connected)
        
            if (!connected)
            
                Console.Clear();
                Console.WriteLine("Listening for F1 2020...");
            
        

        private static void TelemetryUpdate(PacketCarTelemetryData packet)
        
            int playerIndex = packet.Header.playerCarIndex;
            CarTelemetryData playerData = packet.carTelemetryData[playerIndex];
            Console.SetCursorPosition(0, 0);

            WriteLine($"Throttle: playerData.throttle");
        

        private static void WriteLine(string input)
        
            Console.Write(input.PadRight(Console.WindowWidth, ' '));
        
    

Windows 窗体:

namespace F1_2021

    public partial class Form1: Form
    
       
       
        public Form1()
        
            
            InitializeComponent();
        
        

        private void Form1_Load(object sender, EventArgs e)
        
            F12020TelemetryClient client = new F12020TelemetryClient(20777);
            client.OnCarTelemetryDataReceive += TelemetryUpdate;
            client.OnConnectStatusChanged += OnConnectStatusChange;
        

        private void OnConnectStatusChange(bool connected)
        
            if (!connected)  label1.Text = "Not conected wait....."; 
            else   label1.Text = "Conected"; 
        

        private void TelemetryUpdate(PacketCarTelemetryData packet)
        
             
            int playerIndex = packet.Header.playerCarIndex;
            CarTelemetryData playerData = packet.carTelemetryData[playerIndex];
            label2.Text = (playerData.throttle).ToString() ;

        
    

我有什么不明白的?

【问题讨论】:

“不起作用”是什么意思? 我有什么不明白的? - 猜测一下,因为您没有将F12020TelemetryClient client 存储在任何比Form_Load 寿命更长的东西中方法它在表单出现在屏幕上后不久就被处理掉了,因此不再是一个东西;没有客户端 -> 没有连接,没有连接 -> 没有更新您的标签。也许将它存储为一个类范围的变量,看看它是怎么回事 【参考方案1】:

在您的控制台应用程序中,只要应用程序正在运行,F12020TelemetryClient 实例就会一直保持活动状态。

在您的 Windows 窗体应用程序中,它是 Form_Load 方法中的一个局部变量。一旦该方法结束,它就有资格进行垃圾收集。改为将其作为您班级的一个字段。

您还需要检查是否在 UI 线程上引发了事件;如果没有,您需要先对 UI 线程的调用进行编组,然后才能更新任何控件。

public partial class Form1 : Form

    private F12020TelemetryClient _client;
    
    public Form1()
    
        InitializeComponent();
    

    private void Form1_Load(object sender, EventArgs e)
    
        _client = new F12020TelemetryClient(20777);
        _client.OnCarTelemetryDataReceive += TelemetryUpdate;
        _client.OnConnectStatusChanged += OnConnectStatusChange;
    

    private void OnConnectStatusChange(bool connected)
    
        if (InvokeRequired)
        
            BeginInvoke((Action<bool>)OnConnectStatusChange, connected);
        
        else
        
            if (!connected)  label1.Text = "Not conected wait....."; 
            else   label1.Text = "Conected"; 
        
    

    private void TelemetryUpdate(PacketCarTelemetryData packet)
    
        if (InvokeRequired)
        
            BeginInvoke((Action<PacketCarTelemetryData>)TelemetryUpdate, packet);
        
        else
        
            int playerIndex = packet.Header.playerCarIndex;
            CarTelemetryData playerData = packet.carTelemetryData[playerIndex];
            label2.Text = (playerData.throttle).ToString() ;
        
    

【讨论】:

【参考方案2】:

尝试将客户端移到顶部

 public partial class Form1 : Form

 
 F12020TelemetryClient client = new F12020TelemetryClient(20777);

 public Form1()
....

【讨论】:

@CaiusJard 真的很抱歉,但是您的评论和我的回答之间的差异不到一分钟,而且他们通常会延迟发表评论。我通常需要几分钟来准备答案。因此,我在发布答案后通知了您的评论。你可以看到我的评分。我不需要'......它可能是',我知道。我只是要求别的东西 你应该解释为什么这会有所帮助【参考方案3】:

谢谢你一切都已经正常工作了。

namespace F1_2021

    public partial class Form1 : Form
    
       
        F12020TelemetryClient client = new F12020TelemetryClient(20777);

        public Form1()
        
            
            InitializeComponent();
        
        

        private void Form1_Load(object sender, EventArgs e)
        
            client.OnCarTelemetryDataReceive += TelemetryUpdate;
            client.OnConnectStatusChanged += OnConnectStatusChange;
          
        
 
        private void OnConnectStatusChange(bool connected)
        
            label1.Invoke(new Action(delegate ()
            
                if (!connected)  label1.Text = "Not conected wait....."; 
                else  label1.Text = "Conected"; 
            ));
        

        private void TelemetryUpdate(PacketCarTelemetryData packet)
        
             
            int playerIndex = packet.Header.playerCarIndex;
            CarTelemetryData playerData = packet.carTelemetryData[playerIndex];
              label2.Invoke(new Action(delegate ()
              
                label2.Text = (playerData.throttle).ToString();
              ));       

        
    

【讨论】:

由于这与理查德给出的答案几乎相同并被您接受,您为什么将其作为附加答案发布?

以上是关于为啥它不起作用,控制台程序转换为 Windows Form C# [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用点符号在控制台中记录数据对象但它不起作用,为啥?

如何在 Windows 中将 .ui 转换为 py?

为啥我的 JavaScript RGB Hex 转换器不起作用?

我不明白为啥 CSS 转换在 keydown 上不起作用 [重复]

浮动动作按钮!为啥它不起作用?

有条件的分配,为啥它不起作用?