【发布时间】:2018-10-28 05:59:42
【问题描述】:
我正在制作一个多线程聊天服务器和聊天客户端。客户端有一个名为 Login 的 Form1 和一个名为 MainProgram 的 Form2。以下代码来自“登录”。我正在尝试做的是从登录过渡到主程序...
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循环的情况下启动这个线程。并且没有过渡。
【问题讨论】:
-
您的
MainProgram函数不应调用Receive。 -
那我该如何启动线程呢?
-
你怎么知道你的程序卡在这个线程里了?
-
通过调试。我在循环中放置了一个断点并通过步进进行调试。好像我只有一个线程。在调试时顶部的下拉菜单中我只有MainThread
-
为什么你的
Recieve方法被定义为返回一个ThreadStart类型的值?
标签: c# multithreading sockets system.net.sockets