初始化时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"。我不知道我做错了什么。

初始化时ThreadState异常

这似乎与。net中使用COM (web浏览器控件使用COM)有关,其中线程公寓需要设置为STA

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

看看这个