0

我正在尝试通过制作自己的小型网络库来学习网络。目前我有一个这样的代码可以使用的新客户端列表。如果列表中有任何内容,则 NewClientConnected() 方法返回 true 并删除第一个元素。

ConnectedClient newClient; // ConnectedClient is my class storing it's socket and stream and all that.
if(NewClientConnected(out newClient)
{
...handling new client, notification, etc...
}

检查新数据包(流的前缀切片)也是如此。我试图将其提升到一个新的水平,并尝试在此类事情发生时引发事件并从新的联系开始。问题是,该事件是从另一个线程引发的,导致在 form1.cs 中处理该事件时发生异常。

如何确保事件由静态非控制类的主线程处理?我应该继续做我该做的事吗?(上面的片段)我听说过消费者生产关系的想法,如果我没记错的话,它仍然需要一个计时器(使用它自己的线程)或另一个线程。

我试图用谷歌搜索它并在这里查看,但每个人似乎都有不同的问题。它在一个库项目中,而另一个项目(我的服务器和客户端测试)正在引用它。

提前致谢。

4

2 回答 2

1

如果您要执行的操作与用户界面交互,那么您必须在 UI 线程上调用它们。

所以不要直接处理事件,试试这个:

// Somewhere in the form1 code:
Server.newConnectionEvent += ConnectionEVentHandler(myMethod)

public void myMethod()
{
  //Event method called from another thread
  //can only do things here that do affect the UI!
  this.Dispatcher.Invoke(CalledOnUIThread);
}

public void CalledOnUIThread()
{
  //Handle event on UI thread here
  //Can do things here that affect the UI
}

此代码必须从 form1 类运行,因为它使用“this”。因此,您所做的所有更改(大概,您没有显示您的事件处理程序代码)就是将您想要运行的实际代码放在单独的方法中,然后从事件处理程序中调用该单独的方法。

有关调度程序类的 API 文档,请参阅http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.aspx 。

请参阅UI 线程的定义是什么?.NET 应用程序中是否只有一个 UI 线程?对于 UI 线程的简单解释。

于 2011-07-14T08:20:58.433 回答
0

看看 Control.Invoke 和 Control.BeginInvoke 方法。

Control.Invoke -“在拥有控件的底层窗口句柄的线程上执行指定的委托。”

http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.begininvoke.aspx

这应该可以解决您的“另一个线程异常”

于 2011-07-14T08:14:47.323 回答