我有一个主要的表单类和另一个类。在第二节课中,我有一个线程循环:
public void StartListening()
{
listening = true;
listener = new Thread(new ThreadStart(DoListening));
listener.Start();
}
// Listening for udp datagrams thread loop
/*=====================================================*/
private void DoListening()
{
while (listening)
{
IPEndPoint remoteIPEndPoint = new IPEndPoint(IPAddress.Any, port);
byte[] content = udpClient.Receive(ref remoteIPEndPoint);
if (content.Length > 0)
{
string message = Encoding.ASCII.GetString(content);
delegMessage(message);
}
}
}
// Stop listening for udp datagrams
/*=====================================================*/
public void StopListening()
{
lock (locker)
{
listening = false;
}
}
在主窗体类中,我在类构造函数
中开始监听 udp.StartListening();
而且,在这个主要的表单类中,我也有键挂钩事件。在这种情况下,我想在第二堂课中停止线程运行。
private void hook_KeyPressed(int key)
{
if (key == (int)Keys.LMenu)
altPressed = true;
if (key == (int)Keys.F4 && altPressed == true)
udp.StopListening();
}
不幸的是,线程仍然在运行。 你对此有什么想法吗?
非常感谢。
答案 0 :(得分:4)
您的帖子在byte[] content = udpClient.Receive(ref remoteIPEndPoint);
行被阻止。接收方法将阻塞,直到收到某些内容。
您应该使用异步版本(BeginReceive)。
答案 1 :(得分:1)
此外,代码中的另一个缺陷 - 您在没有任何同步的情况下检查停止条件。这里:
private void DoListening()
{
while (listening){ //this condition could stuck forever in 'false'
}
实际上,没有内存障碍,无法保证正在运行DoListening
的线程会看到从其他线程更改为listening
var。你应该至少在这里使用锁定(这提供了内存屏障)
答案 2 :(得分:1)
正如@igelineau指出的那样 - 您的代码在接收呼叫上被阻止。如果你不想;想要沿着异步路线(我建议的话)走下去,只需在你的停止监听方法中向udp端口发送一些东西。