初始化时ThreadState异常
本文关键字:异常 ThreadState 初始化 | 更新日期: 2023-09-27 17:49:43
这是一个很长的问题,所以这里是总结,
- 我有一个客户端类为我的信使项目。
- 我的客户端类有一个Socket
- 我使用它的BeginReceive方法从服务器获取消息。在异步回调BeginReceive,我得到消息使用EndReceive。 当我得到消息时,我用消息本身触发messagerreceived事件。我在我的消息表单中使用这个Client类。
- 在消息形式中,我可以通过向client . messagerreceived附加一个方法来获取收到的消息。
- 我使用onmessagerreceived方法用于此目的。
- 当我得到消息,我可以显示它的文本框(使用Control.Invoke)或MessageBox。
- 我还可以在onmessagerreceived的TabControl中添加一个新标签。 当我试图初始化一个WebBrowser控件,我得到ThreadStateException.
- 我用来显示消息的控件来自WebBrowser控件,所以我需要它。
- Threading.Thread.CurrentThread。ThreadState是"Background".
我认为你不需要这些细节,但你可以在下面找到我最初打算发布的详细问题。
许多谢谢。我在一个信使项目(服务器是一个Windows服务和客户端是一个Windows窗体应用程序)使用。套接字的异步方法。我在Socket.BeginReceive的回调中触发客户端的messagerreceived事件;在你来之前,一切都是我想要的。
我在我的表单中使用messagerreceived事件(两个人互相写的事件),我可以使用Control对UI做任何我想做的事情。调用方法(如果需要),但有一个恼人的异常。
我在表单中有选项卡对话,所以当消息到达时,我检查是否有与发送者打开的对话(选项卡)。如果是,则选择该选项卡并显示消息。如果没有,我创建一个新的ConversationTab。
现在,我很抱歉,如果这是一个比它应该是一个很长的问题,或者如果我不能充分解释自己。英语不是我的第一语言,这是我在Stack Overflow的第一个问题。这里是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源自WebBrowser,我使用它的原因是我不能应用自定义样式(颜色,字体,大小)'per message'使用RichTextBox。RichTextBox。SelectedColor并不总是工作,或者我不能使它按预期工作。MessageBrowser让我用CSS代替。跑题?对不起。
下面是我在messagerreceived事件触发时调用的NewConversation方法:
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
}
"Conversations"获取TabControl的选项卡页,"ActiveConversation"获取或设置TabControl的SelectedTab属性。我创建这些属性的目的主要是在内部使用线程安全逻辑。
所以问题是:它在上面代码的"tab = new ConversationTab(friend)"部分抛出ThreadStateException。它是第一段代码的"MessageBrowser = new MessageBrowser()"部分,也是MessageBrowser的构造函数。我没有提供MessageBrowser的构造函数代码的原因是,在执行任何一行内部代码之前都会抛出异常(这是关于WebBrowser的构造函数的,当我尝试初始化WebBrowser时,我也会得到这个异常)。实际上我甚至没有得到异常,应用程序在没有任何通知的情况下就关闭了。我看到的例外,当我试图调用"MessageBrowser = new MessageBrowser()"在ConversationTab的构造函数在观察窗口。
我对使用线程和异步方法有点陌生。MSDN说:
ThreadStateException由由于线程当前状态而无法执行所请求操作的方法抛出。
在我的例子中,线程的状态是"Background"。我不知道我做错了什么。
这似乎与。net中使用COM (web浏览器控件使用COM)有关,其中线程公寓需要设置为STA
。
尝试将[STAThread]
添加到您的入口点。
看看这个