这是一个长期的问题,所以这里是总结第一,的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