c# - 初始化中的ThreadState异常

标签 c# multithreading sockets asynchronous

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

  • 我的Messenger项目有一个Client类。
  • 我的客户类有一个套接字。
  • 我使用其BeginReceive方法从服务器获取消息。
  • 在BeginReceive的异步回调中,我使用EndReceive得到消息。
  • 当我收到消息时,将使用消息本身触发MessageReceived事件。
  • 我在邮件表单中使用此Client类。
  • 在消息形式中,我可以通过将方法附加到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方法(如果需要)对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
        }
    

    “对话”获取TabControl的标签页,而“ActiveConversation”获取或设置TabControl的SelectedTab属性。
    创建这些属性的主要目的是内部的线程安全逻辑。

    所以问题来了:在上面代码的“tab = new ConversationTab(friend)”部分中抛出ThreadStateException。它是第一个代码的“MessageBrowser = new MessageBrowser()”部分,也是MessageBrowser的构造函数。我之所以不提供MessageBrowser的构造函数代码,是因为在执行任何内部代码行之前都会引发异常(这与WebBrowser的构造函数有关,当我尝试初始化WebBrowser时,也会出现此异常。)
    实际上,我什至没有收到异常,应用程序只是在不通知我任何事情的情况下关闭了。当我尝试在“监视”窗口中的ConversationTab的构造函数上调用“MessageBrowser = new MessageBrowser()”时,看到了异常。

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

    ThreadStateException is thrown by methods that cannot perform the requested operation due to the current state of a thread.



    在我的情况下,线程的状态为“背景”。
    我不知道我在做什么错。

    如果您阅读了全部内容,将非常感谢;如果您能提供帮助,则非常感谢。

    最佳答案

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

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

    看看this

    关于c# - 初始化中的ThreadState异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5637424/

    相关文章:

    web.config 文件中的 C# 连接字符串

    c# - Asp.net mvc 4 如何使用带有自定义字段的 WebSecurity.createUserAndAccount

    c++ - C++中计算耗时,非阻塞,无线程

    multithreading - 我需要一个带有线程的程序的想法

    .net - 大量文件之间大量数据的最快套接字方法

    c - 具有 C 套接字和 pthreads 的多线程 TCP 服务器 - 为什么accept() 在第二个请求上阻塞?

    c# - 可以在 Java 中使用 C# 样式的对象初始化吗?

    c# - 有没有办法确定哪个类在 .NET 中调用了静态方法

    MySQL 死锁 - 访问不同的主键值也会造成死锁

    sockets - 什么是 AF_INET,为什么需要它?