C#thread在另一个类中启动

时间:2013-09-23 13:23:22

标签: c# multithreading events

我有一个主要的表单类和另一个类。在第二节课中,我有一个线程循环:

    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();
    } 

不幸的是,线程仍然在运行。 你对此有什么想法吗?

非常感谢。

3 个答案:

答案 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端口发送一些东西。