2013-09-23 47 views
2

我有一個主窗體類和另一個類。在第二類中,我有一個線程循環:在另一個類中啓動的C#線程

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

你調用'StopListening'來檢查狀態是否已經改變了,你調試過'while(listen)'loop *嗎? – James

+0

您是否調試過並檢查是否執行了「StopListening」? –

+0

是的,我試過了,這是一個「聽」仍然是真的問題。 – Majak

回答

4

您的線程阻止在byte[] content = udpClient.Receive(ref remoteIPEndPoint);行。接收方法會阻塞,直到收到某些東西。

您應該改用異步版本(BeginReceive)。

+0

非常感謝,我會試試看看它。 – Majak

1

此外,代碼中的另一個缺陷 - 您檢查沒有任何同步的停止條件。在這裏:

private void DoListening() 
    { 
    while (listening){ //this condition could stuck forever in 'false' 
    } 

事實上,沒有一個內存屏障,也不能保證,一個線程,運行​​永遠不會看到其他線程listening VAR的變化。你至少應該在這裏使用鎖定(提供內存屏障)

+0

一個有效的觀點,但我寧願不要惹動易失性,直到絕對必要:http://www.albahari.com/threading/part4.aspx#_Memory_Barriers_and_Volatility – undefined

+0

你是對的。我還不精通線程同步,不幸... – Majak

+0

@undefined哇。那麼,如果喬·達菲和約瑟夫·阿爾巴哈里說要注意這絕對是一個好主意。 –

1

正如@igelineau指出的那樣 - 你的代碼在接收調用時被阻塞。如果你不想走下異步路由(我建議),只需在停止監聽方法中將某些內容發送到udp端口即可。

+0

我現在試過,它的工作原理,謝謝! – Majak

相關問題