初始化中的ThreadState异常

时间:2011-04-12 15:07:12

标签: c# multithreading sockets asynchronous

这是一个很长的问题,所以首先是摘要,

  • 我的messenger项目有一个Client类。
  • 我的客户端类有一个Socket。
  • 我使用BeginReceive方法从服务器获取消息。
  • 在BeginReceive的异步回调中,我使用EndReceive获取消息。
  • 当我收到消息时,我会使用消息本身触发MessageReceived事件。
  • 我在邮件表单中使用此Client类。
  • 在消息表单中,我可以通过将方法附加到Client.MessageReceived来获取收到的消息。
  • 我为此目的使用OnMessageReceived方法。
  • 当我收到消息时,我可以在TextBox(使用Control.Invoke)或MessageBox上显示它。
  • 我还可以在OnMessageReceived中的TabControl中添加一个新选项卡。
  • 当我尝试初始化WebBrowser控件时,我得到ThreadStateException。
  • 我用来显示消息的控件来自WebBrowser控件,所以我需要它。
  • Threading.Thread.CurrentThread.ThreadState是“背景”。

我认为您不需要详细信息,但您可以在下面找到我首先发布的详细问题。

非常感谢。


我正在使用Net.Socket的异步方法开发一个信使项目(服务器是Windows服务,客户端是Windows窗体应用程序)。 我在Socket.BeginReceive的回调中触发Client的MessageReceived事件; 一切都是我希望他们在这里的方式。

我在我的表单中使用MessageReceived事件(两个人互相写入的事件)我可以使用Control.Invoke方法(如果需要)向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,我使用它的原因是因为我无法使用RichTextBox为每条消息应用自定义样式(颜色,字体,大小)。 RichTextBox.SelectedColor并不总是有效,或者我无法按预期工作。 MessageBrowser让我使用CSS代替。徘徊在主题之外?遗憾。

这是我在MessageReceived事件触发时调用的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的第一个代码和构造函数的“MessageBrowser = new MessageBrowser()”部分。我没有提供MessageBrowser的构造函数代码的原因是因为在执行任何内部代码行之前抛出了异常(这是关于WebBrowser的构造函数,当我尝试初始化WebBrowser时,我得到了这个异常。) 实际上我甚至没有例外,应用程序只是在那里关闭而没有通知我任何事情。当我尝试在Watch窗口中的ConversationTab的构造函数上调用“MessageBrowser = new MessageBrowser()”时,我看到了异常。

我对使用线程和异步方法有点新意。 MSDN说:

  

由于线程的当前状态,无法执行请求的操作的方法抛出ThreadStateException。

在我的情况下,线程的状态是“Background”。 我不知道我做错了什么。

非常感谢你,如果你能阅读整篇文章的话,非常感谢你,如果你能提供帮助的话,还要多谢。

1 个答案:

答案 0 :(得分:1)

这似乎与在.NET中使用COM(Web浏览器控件使用COM)有关,其中线程单元需要设置为STA

尝试将[STAThread]添加到您的入口点。

查看this