在 Form2() 中启动 "new thread IsBackground = true " 并陷入 while(true) 循环
Starting a "new thread IsBackground = true "in Form2() and getting stuck in while(true) loop
我正在制作多线程聊天服务器和聊天客户端。客户端有一个名为 Login 的 Form1 和一个名为 MainProgram 的 Form2。以下代码来自"Login"。我要做的是从登录过渡到主程序...
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()}");
}
}
}
请注意线程应该是 运行 这个 while 无限循环,但是在后台。现在它不创建新线程并在 MainThread 上运行。问题是我不知道如何在不让客户端陷入这个 while 循环的情况下启动这个线程。而不是过渡。
你好像没看懂什么是ThreadStart
。这是创建线程所接受的方法的签名。
当你打电话时:
new Thread(Receive())
您实际上是在主线程中调用 "Receive" 方法,并将其 return 值提供给线程构造函数(这永远不会发生,因为它卡在了无限循环中。
相反你需要做
new Thread(new ThreadStart(Receive))
注意删除的括号。
但是随后您会收到编译错误,因为您的 Receive 方法没有正确的签名。所以需要改成:
private void Receive()
{
// ...
}
我正在制作多线程聊天服务器和聊天客户端。客户端有一个名为 Login 的 Form1 和一个名为 MainProgram 的 Form2。以下代码来自"Login"。我要做的是从登录过渡到主程序...
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()}");
}
}
}
请注意线程应该是 运行 这个 while 无限循环,但是在后台。现在它不创建新线程并在 MainThread 上运行。问题是我不知道如何在不让客户端陷入这个 while 循环的情况下启动这个线程。而不是过渡。
你好像没看懂什么是ThreadStart
。这是创建线程所接受的方法的签名。
当你打电话时:
new Thread(Receive())
您实际上是在主线程中调用 "Receive" 方法,并将其 return 值提供给线程构造函数(这永远不会发生,因为它卡在了无限循环中。
相反你需要做
new Thread(new ThreadStart(Receive))
注意删除的括号。
但是随后您会收到编译错误,因为您的 Receive 方法没有正确的签名。所以需要改成:
private void Receive()
{
// ...
}