gpt4 book ai didi

c# - 初始化中的ThreadState异常

转载 作者:行者123 更新时间:2023-12-03 12:06:39 26 4
gpt4 key购买 nike

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

  • 我的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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com