这是一个很长的问题,所以首先是摘要,
我认为您不需要详细信息,但您可以在下面找到我首先发布的详细问题。
非常感谢。
我正在使用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”。 我不知道我做错了什么。
非常感谢你,如果你能阅读整篇文章的话,非常感谢你,如果你能提供帮助的话,还要多谢。
答案 0 :(得分:1)