我正在制作多线程聊天服务器和聊天客户端。客户端有一个名为Login的Form1和一个名为MainProgram的Form2。以下代码来自“登录”。我要做的是从Login转换到MainProgram ......
MainProgram mP = new MainProgram(clientSocket, username);
mP.Closed += (s, args) => this.Close();
this.Hide();
mP.ShowDialog();
mP.Show();
......但是。分配mP时MainProgram mP = new MainProgram(clientSocket, username);
代码被卡在此处指定的线程中:
public MainProgram(TcpClient c, string u)
{
InitializeComponent();
try
{
serverStream = c.GetStream();
clientSocket = c;
username = u;
new Thread(Receive()) { IsBackground = true }.Start();
}
这是主题:
private ThreadStart Receive()
{
while (true)
{
try
{
byte[] inStream = new byte[1024];
serverStream.Read(inStream, 0, inStream.Length);
string returndata = Encoding.ASCII.GetString(inStream);
returndata = returndata.Substring(0, returndata.IndexOf("$"));
Msg($"{returndata}");
}
catch(Exception e)
{
MessageBox.Show($"{e.Message}\n\n{e.ToString()}");
}
}
}
请注意,线程应该在无限期循环时运行,但在后台运行。现在它不会创建一个新线程并在MainThread上运行。问题是我不知道如何在不使客户端陷入此循环的情况下启动此线程。而不是过渡。
答案 0 :(得分:1)
您似乎并不了解ThreadStart
是什么。这是创建线程所接受的方法的签名。
致电时:
new Thread(Receive())
您实际上正在呼叫"接收"主线程中的方法,并将其返回值提供给线程构造函数(这种情况从未发生过,因为它卡在了无限循环中。
相反,你需要做
new Thread(new ThreadStart(Receive))
请注意删除的括号。
但是,由于您的Receive方法没有正确的签名,因此您将收到编译错误。所以你需要把它改成:
private void Receive()
{
// ...
}