为什么当我在另一个窗体上使用 Show 方法时,窗口窗体卡住并且无法打开



打开另一个表单的位置:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace DataDemoLogin
{
public partial class Form2 : Form
{
Form1 game;
int portNo = 1500;
private string ipAddress = "127.0.0.1";
TcpClient client; //client Socket
byte[] data; //store the data that send to & from the server
private string key = "rectangle";
public Form2()
{
InitializeComponent();
client = new TcpClient();
client.Connect(ipAddress, portNo);
data = new byte[client.ReceiveBufferSize];
// continue reading
client.GetStream().BeginRead(data, 0, System.Convert.ToInt32(client.ReceiveBufferSize), ReceiveMessage, null);
}
private void ReceiveMessage(IAsyncResult ar)
{
try
{
int bytesRead;
// read the data from the server
bytesRead = client.GetStream().EndRead(ar);
if ((bytesRead >= 1))
{
// invoke the delegate to display the recived data
string incomingData = System.Text.Encoding.ASCII.GetString(data, 0, bytesRead);
incomingData = decrypt(incomingData);
if (incomingData == "loginok" || incomingData == "loginnotok" || incomingData == "registok" || incomingData == "regist not ok")
{
MessageBox.Show(incomingData);
if (incomingData == "loginok")
{
game = new Form1();
game.Show();
SendMessage("look");
}
}
/*if (incomingData == "waiting" || incomingData == "connecting")
{
game.recievePrivateMessagaes(incomingData);
}*/
}
// continue reading
client.GetStream().BeginRead(data, 0, System.Convert.ToInt32(client.ReceiveBufferSize), ReceiveMessage, null);
}
catch (Exception ex)
{
// ignore the error... fired when the user loggs off
}
} // end ReceiveMessage
/// <summary>
/// convert the message to ASCII code send message to the server
/// </summary>
/// <param name="message">the data to send</param>
private void SendMessage(string message)
{
try
{
if (message.StartsWith("%%%%login%%%"))
{
message = "%%%%login%%%" + encrypt(message.Remove(0, 12) , key);
}
else if (message.StartsWith("%%%regist%%%"))
{
message = "%%%regist%%%" + encrypt(message.Remove(0, 12), key);
}
else
{
message = encrypt(message, key);
}
// send message to the server
NetworkStream ns = client.GetStream();
byte[] data = System.Text.Encoding.ASCII.GetBytes(message);
// send the text
ns.Write(data, 0, data.Length);
//ns.Flush();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
} //end SendMessage
private void registbtn_Click(object sender, EventArgs e)
{
string username = txbusername.Text;
string password = txbpassword.Text;
string fname = txbfname.Text;
string lname = txblname.Text;
string email = txbemail.Text;
string city = txbcity.Text; 
//1 //sql statement
SendMessage("%%%regist%%%" + username + "9" + password + "9" + fname + "9" + lname + "9" + email + "9" + city);
}
private void loginbtn_Click(object sender, EventArgs e)
{
string username = txbuserlogin.Text;
string password = txbpasslogin.Text;
//1 //sql statement
SendMessage("%%%%login%%%" + username + "9" + password);
}

我要打开的表单:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace DataDemoLogin
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private int Speed = 5;
private string facing = "right";
private int coinsCollected = 0;
private void Keyisdown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Left)
{
timer2.Enabled = true;
facing = "left";
player.Image = Properties.Resources.left;
}
if (e.KeyCode == Keys.Right)
{
timer2.Enabled = true;
facing = "right";
player.Image = Properties.Resources.right;
}
if (e.KeyCode == Keys.Down)
{
timer2.Enabled = true;
facing = "down";
player.Image = Properties.Resources.down;
}
if (e.KeyCode == Keys.Up)
{
timer2.Enabled = true;
facing = "up";
player.Image = Properties.Resources.up;
}
if (e.KeyCode == Keys.Left)
{
timer2.Enabled = true;
facing = "left";
}
if (e.KeyCode == Keys.Right)
{
timer2.Enabled = true;
facing = "right";
}
if (e.KeyCode == Keys.Down)
{
timer2.Enabled = true;
facing = "down";
}
if (e.KeyCode == Keys.Up)
{
timer2.Enabled = true;
facing = "up";
}
}
private void gameEngine(object sender, EventArgs e)
{
if (facing == "right")
{
player.Left += Speed;
}
if (facing == "left")
{
player.Left -= Speed;
}
if (facing == "up")
{
player.Top -= Speed;
}
if (facing == "down")
{
player.Top += Speed;
}
if (player.Left < -10)
{
player.Left = 590;
}
if (player.Left > 600)
{
player.Left = 10;
}
if (player.Top < -10)
{
player.Top = 400;
}
if (player.Top > 410)
{
player.Top = 10;
}
foreach (Control x in this.Controls)
{
if ((string)x.Tag == "wall")
{
if (player.Bounds.IntersectsWith(x.Bounds))
{
gameOverPlayer("wall");
}
}
else if ((string)x.Tag == "coin")
{
if (player.Bounds.IntersectsWith(x.Bounds) && x.Visible)
{
coinsCollected++;
x.Visible = false;
}
}
}
if (coinsCollected == 102)
{
gameOverPlayer("coins");
}
}
private void gameOverPlayer(string message)
{
timer2.Stop();
}
/*public void recievePrivateMessagaes(string message)
{
if (message == "waiting" || message == "connected")
{
MessageBox.Show(message);
}
}*/
}
}

当表单打开时,它卡住了,显示如下:

表单显示的内容

前一种形式仍然有效,但另一种形式不起作用当我使用ShowDialog()方法时,表单打开,但前一个表单停止工作。

我没有得到任何错误或其他东西,唯一的事情是当我最小化的形式,我不能重新打开它。

您不能在非gui线程上打开Form(或从Control派生的任何内容)。

这个线程有正确的COM行为和消息泵送,你会看到在Main中默认启动主表单的属性和方式。

这不是一个bug。

您可以使用Invoke(阻塞)或BeginInvoke(非阻塞)封送到UI线程。

如果你想检查你是否在GUI线程上,使用InvokeRequired。在当前尝试显示表单时,它将返回true,表示需要封送。

最新更新