0

我正在关注这个 TCP 客户端/服务器示例

www.codeproject.com/Articles/1415/Introduction-to-TCP-client-server-in-C

我对 WinForms 比对控制台应用程序更熟悉,所以我决定在 WinForms 中重新编写代码。我有相同形式的客户端和服务器代码。初始化服务器时,我使用 AcceptSocket() 后表单被卡住,我无法使用按钮从客户端启动操作。这是否意味着我必须在单独的 WinForms 中编写客户端和服务器?=/

4

2 回答 2

3

您需要在单独的线程中运行它们。确保您没有阻塞 UI 线程,否则 UI 将变得无响应。

于 2012-12-27T15:36:48.720 回答
3

您需要能够在不占用 UI 线程的情况下读取套接字。否则,窗口将显示无响应。

你有两个选择。第一个,也是表面上最简单的,是如前所述显式使用线程。

第二种是使用接受/读/写函数的异步版本之一(BeginXXX/EndXXX或者XXXAsync,取决于您使用的 API),它为您从线程池启动另一个线程。(这些Async版本实际上在事件发生之前不会抓取线程,而Begin/End可能会立即抓取一个线程。)除非您实际上需要专门为一个新线程专门用于监视套接字(而您几乎从未真正这样做过),否则我更喜欢异步的东西。

无论哪种方式,您都需要了解一些关于多线程的知识。在这种情况下,您需要记住的重要事情是(1)无论您如何做,您的套接字内容几乎肯定会在另一个线程上发生;(2) WinForms 控件讨厌被其他线程直接访问;您将需要使用他们的Invoke方法来使事情发生在 UI 线程上。

于 2012-12-27T15:43:30.923 回答