这是一个很长的问题,所以这里是摘要,
我认为您不需要详细信息,但是您可以在下面找到我首先打算发布的详细问题。
非常感谢。
我正在使用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/