C# 表单是否显示取决于我如何调用它

C# 表单是否显示取决于我如何调用它,c#,C#,我正在开发一个分析UDP网络数据包的应用程序,但我遇到了一个奇怪的情况 我这里有一张表格6,上面有这些活动: public void timer1_Tick(object sender, EventArgs e) { this.Invalidate(); } private void Form6_Paint(object sender, PaintEventArgs e) { //STUFF...

我正在开发一个分析UDP网络数据包的应用程序,但我遇到了一个奇怪的情况

我这里有一张表格6,上面有这些活动:

public void timer1_Tick(object sender, EventArgs e)
        {
            this.Invalidate();
        }

private void Form6_Paint(object sender, PaintEventArgs e)
        {
            //STUFF...
        }
然后,在另一个类上,我必须创建Form6的一个实例

如果我这样做,Form6实例就会出现,但我依靠计时器来完成我需要的工作,这并不是一个好方法,但它是有效的:

public void newpacket(Packet p_packet)
        {
            //STUFF...
            newnotif = true;
        }

private void timer1_Tick_1(object sender, EventArgs e)
        {
            if (newnotif == true)
            {
                newnotif = false;
                Form6 f6 = new Form6();
                f6.notifname = namenotifconnect;
                if (Class1.notifpos)
                    Class1.notifpos = false;
                else
                    Class1.notifpos = true;
                f6.Show();
                f6.timer1.Enabled = true;
                f6.temp = DateTime.Now;
            }
        }
但是,如果我这样做,例如调用一个方法,表单将不会显示,但我知道它已创建,因为我可以在任务栏中看到带有Form6名称的图标

public void newpacket(Packet p_packet)
        {
            //STUFF...
            notif(1, namenotifconnect);
        }

public void notif(int type,string name)
        {
            if(type == 1) //SHOW
            {
                    Form6 f6 = new Form6();
                    f6.notifname = name;
                    if (Class1.notifpos)
                        Class1.notifpos = false;
                    else
                        Class1.notifpos = true;
                    f6.Show();
                    f6.timer1.Enabled = true;
                    f6.temp = DateTime.Now;
            }
        }
另一种工作方式是,如果我在buttonclick事件中执行“创建实例代码”,但这不是我想要的,因为当我收到数据包时,它必须是自动的

不知道为什么会发生这种情况,为什么会使用计时器,而不是“notif”方法


希望有人能告诉我这里发生了什么。

根据我看到的评论,您正试图在后台线程上创建表单,这很可能是您看到这种意外行为的原因

UI组件只能在UI线程上创建/访问和修改。您可以使用/


“newpacket”是否恰好被另一个线程调用?实际上,它只是出现在另一个线程上另一个方法的参数中:recPaquetsThread=newthreadrecpaquets;recPaquetsThread.Start;private void recPaquets{communicator.ReceivePackets0,newpacket;}这是您的问题,UI组件只能从UI线程创建/访问和修改,您可以通过使用First,它是什么类型的计时器System.Timers.timer或System.Windows.Forms.timer或System.Threading.timer?。第二,如果使用ShowDialog而不是Show,它是否有效?这将使该线程成为新线程的封送处理线程form@M.A.Hanin您也不应该在后台线程上调用ShowDialog。。。
public void newpacket(Packet p_packet)
{
    //STUFF...
    this.Invoke((MethodInvoker)delegate { 
        notif(1, namenotifconnect); 
    });
}