2011-04-12 65 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