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