2011-04-06 60 views
0

我有一個c#Win Forms應用程序,我寫了它,它有兩個線程 - 主線程(GUI)和一個線程,每隔x秒(心跳)響應服務器是可重複使用的。 但是當我在主線程上運行一些代碼(刪除標籤,處理東西)gui得到的響應並且線程沒有發送心跳 - 我做錯了什麼? 謝謝:)一個線程不響應,而應用程序處理

線程創建這樣的:

thrMessaging = new Thread(new ThreadStart(ReceiveMessages)); 
thrMessaging.Start(); 

,實際上是一個線程負責所有的消息從療法服務器獲取 - 它是這樣的:

private void ReceiveMessages() 
    { 
     // Receive the response from the server 
     srReceiver = new StreamReader(tcpServer.GetStream()); 
     while (Connected) 
     { 

      // Show the messages in the log TextBox 
      //this.Invoke(new UpdateLogCallback(this.UpdateLog), new object[] { srReceiver.ReadLine() }); 
      try 
      { 
       String con = srReceiver.ReadLine(); 
       string StringMessage = HttpUtility.UrlDecode(con, System.Text.Encoding.UTF8); 
       //MessageBox.Show("MESSAGE TRANSLATED:" + StringMessage); 
       processMessage(StringMessage); 
      } 
      catch (IOException e) 
      { 

       connectionTerminated(); 

      } 

     } 
    } 

因爲我需要proceesMessage函數來執行一些UI任務,所以它會這樣:

private void processMessage(string p) 
    { 
     if (InvokeRequired) 
     { 
      Invoke(new MethodInvoker(delegate 
      { 
       lastMessage = DateTime.Now; 
       //MessageBox.Show(p); 
       if (p == "AREYOUALIVE") 
       { 
        SendMessage("ye"); 
       } 
       else if 
       ...... 
     })); 

     } 
    } 

所以線程應該總是響應(每x秒)來自服務器的消息,詢問他是否還活着 - 當他正在執行時不會發生什麼。

+2

你能告訴我們你在做什麼嗎?描述本身並沒有給出任何線索,爲什麼它不起作用。 – 2011-04-06 06:34:03

+0

請給我們展示一些示例代碼 - 比如你如何設置你的線程,以及你的線程代碼做了什麼,然後更新UI,如果是的話,你是如何做到的。 – BugFinder 2011-04-06 06:35:03

+1

沒有足夠的信息來了解您的問題。請分享代碼。後臺線程如何啓動?你使用System.Threading.Timer或其他計時器嗎?後臺線程是否與UI線程同步? – Disposer 2011-04-06 06:35:07

回答

0

我認爲問題可能是這樣的:當你調用調用時,GUI更新是由主線程(GUI的一個)做出的......所以如果你的主線程忙於做別的事情(例如刪除控件)無法通過

Invoke(new MethodInvoker(delegate... 

立即處理這個任務,鎖定執行...

+0

我試圖得到如果退出調用 - 它仍然沒有幫助。 – 2011-04-06 07:40:34

+0

@藍色基因:如何改變thrMessaging的優先級,使用例如AboveNormal? 一個愚蠢的問題:你在主窗體上執行的任務不能在不同的線程中完成,以使GUI免費發送消息? – Marco 2011-04-06 07:47:27

+0

我會嘗試這個好主意,並且沒有任何使用gui的任務不能在不需要調用的情況下在不同的線程上完成 - 如果我調用的話就像在同一個線程中一樣。 – 2011-04-06 08:01:31

0

這很簡單,這是發生在情況下,你使編組到UI線程我可以建議你做一個隊列從服務器的消息並通過定時器在另一個線程中處理這個隊列大約2或3秒,這將很有用ter和處理來自服務器的消息的後臺線程永遠不會掛起。

主要想法是更新UI的頻率不像現在這樣做。

+0

不幸的是我不能處理消息只有2-3秒,因爲這是實時應用程序,反正它不會工作 - 問題是,線程根本不在乎爲什麼GUI忙於執行那個需要他一些時間的功能。 – 2011-04-06 07:42:01

相關問題