這是一個長期的問題,所以這裏是總結第一,的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。
在我的情況下,線程的狀態是「背景」。 我不知道我在做什麼錯。
非常感謝您閱讀整件事情,並感謝您的幫助。
你使用'Control.Invoke()'來調用'NewConversation'方法嗎? – 2011-04-12 15:17:48
其實不,我沒有使用它。我認爲InvokeRequired是決定我是否需要使用Invoke的唯一足夠的東西。 那麼,後臺線程是MTA,並且不停止InvokeRequired返回true(爲什麼要這樣?),所以我用我的Form(它運行在一個STA線程)的Invoke方法來封裝進程的 。 謝謝。 – 2011-04-12 17:35:51