2011-04-12 68 views
1

這是一個長期的問題,所以這裏是總結第一,的ThreadState例外初始化

  • 我有我的使者項目的客戶機類。
  • 我的客戶端類有一個套接字。
  • 我使用它的BeginReceive方法從服務器獲取消息。
  • 在BeginReceive的異步回調中,我使用EndReceive獲取消息。
  • 當我收到消息時,我用消息本身觸發MessageReceived事件。
  • 我在消息表單中使用此客戶端類。
  • 在消息形式中,我可以通過將方法附加到Client.MessageReceived來獲取收到的消息。
  • 爲此我使用OnMessageReceived方法。
  • 當我收到消息時,我可以在TextBox(使用Control.Invoke)或MessageBox上顯示它。
  • 我也可以在OnMessageReceived的TabControl中添加一個新選項卡。
  • 當我嘗試初始化一個WebBrowser控件時,我得到ThreadStateException。
  • 我用來顯示消息的控件派生自WebBrowser控件,所以我需要它。
  • Threading.Thread.CurrentThread.ThreadState是「背景」。

我不認爲你需要的細節,但你可以找到詳細的問題,我第一個計劃在下面發佈。

非常感謝。


我正在使用Net.Socket的異步方法處理messenger項目(服務器是Windows服務,客戶端是Windows窗體應用程序)。 我在Socket.BeginReceive的回調中觸發Client的MessageReceived事件; 一切都是我想讓他們成爲這裏的方式。

我在我的表單中使用MessageReceived事件(兩個人互相寫入的)我可以使用Control.Invoke方法(如果需要)執行任何操作,只需要一個惱人的異常。

我在窗體中有選項卡式對話,所以當消息到達時,我檢查是否有與發送者打開的對話(選項卡)。如果是,我選擇該選項卡並顯示消息。如果否,我創建一個新的ConversationTab。

現在,我很抱歉,如果它是一個長期的問題比它應該是或如果我不能充分解釋自己。英語不是我的第一語言,這是我在堆棧溢出中的第一個問題。 所以,這裏是ConversationTab:

public class ConversationTab : TabPage 
    { 
     public User Friend { get; private set; } 
     public MessageBrowser MessageBrowser { get; private set; } 

     public ConversationTab(User friend) : base(friend.DisplayName) 
     { 
      Friend = friend; 
      MessageBrowser = new MessageBrowser(); 
      Controls.Add(MessageBrowser); 
      MessageBrowser.Dock = DockStyle.Fill; 
     } 
    } 

MessageBrowser從web瀏覽器派生,我用這個的原因是因爲我不能使用RichTextBox的「每封郵件」應用自定義樣式(顏色,字體,大小)。 RichTextBox.SelectedColor不總是工作,或者我無法按預期工作。 MessageBrowser讓我用CSS代替。徘徊於主題?抱歉。

這裏是NewConversation方法我稱之爲的messageReceived事件觸發時:

public void NewConversation(User friend) 
    { 
     ConversationTab tab = Conversations.FirstOrDefault(c => c.Friend.Id == friend.Id); 

     if (tab != null) 
      ActiveConversation = tab; 
     else 
     { 
      tab = new ConversationTab(friend); 
      // add tab to TabControl 
     } 

     // bla 
    } 

「對話」得到的TabControl的標籤頁和「ActiveConversation」獲取或設置的TabControl的SelectedTab財產。 我在創建這些屬性的時候主要是內部的線程安全邏輯。

所以這個問題:它拋出ThreadStateException在「tab = new ConversationTab(friend)」部分上面的代碼。它是MessageBrowser的第一個代碼和構造函數的「MessageBrowser = new MessageBrowser()」部分。爲什麼我沒有提供MessageBrowser的構造函數代碼的原因是因爲在執行任何內部代碼行之前引發異常(這是關於WebBrowser的構造函數,當我嘗試初始化WebBrowser時,我也會得到這個異常。) 實際上我甚至沒有例外,應用程序只是關閉那裏,沒有通知任何事情。我在Watch窗口的ConversationTab的構造函數中嘗試調用「MessageBrowser = new MessageBrowser()」時看到異常。

我是使用線程和異步方法的新手。 MSDN說:

由於線程的當前狀態無法執行請求的操作的方法拋出ThreadStateException。

在我的情況下,線程的狀態是「背景」。 我不知道我在做什麼錯。

非常感謝您閱讀整件事情,並感謝您的幫助。

+0

你使用'Control.Invoke()'來調用'NewConversation'方法嗎? – 2011-04-12 15:17:48

+0

其實不,我沒有使用它。我認爲InvokeRequired是決定我是否需要使用Invoke的唯一足夠的東西。 那麼,後臺線程是MTA,並且不停止InvokeRequired返回true(爲什麼要這樣?),所以我用我的Form(它運行在一個STA線程)的Invoke方法來封裝進程的 。 謝謝。 – 2011-04-12 17:35:51

回答

1

這似乎與.NET中使用COM(Web瀏覽器控件使用COM)有關,其中線程單元需要設置爲STA

嘗試將[STAThread]添加到您的切入點。

看看this

+0

簡單的工作解決方案。非常感謝:) – C4u 2015-03-17 12:21:47