我正在关注这个 TCP 客户端/服务器示例
www.codeproject.com/Articles/1415/Introduction-to-TCP-client-server-in-C
我对 WinForms 比对控制台应用程序更熟悉,所以我决定在 WinForms 中重新编写代码。我有相同形式的客户端和服务器代码。初始化服务器时,我使用 AcceptSocket() 后表单被卡住,我无法使用按钮从客户端启动操作。这是否意味着我必须在单独的 WinForms 中编写客户端和服务器?=/
您需要在单独的线程中运行它们。确保您没有阻塞 UI 线程,否则 UI 将变得无响应。
您需要能够在不占用 UI 线程的情况下读取套接字。否则,窗口将显示无响应。
你有两个选择。第一个,也是表面上最简单的,是如前所述显式使用线程。
第二种是使用接受/读/写函数的异步版本之一(BeginXXX/EndXXX
或者XXXAsync
,取决于您使用的 API),它为您从线程池启动另一个线程。(这些Async
版本实际上在事件发生之前不会抓取线程,而Begin
/End
可能会立即抓取一个线程。)除非您实际上需要专门为一个新线程专门用于监视套接字(而您几乎从未真正这样做过),否则我更喜欢异步的东西。
无论哪种方式,您都需要了解一些关于多线程的知识。在这种情况下,您需要记住的重要事情是(1)无论您如何做,您的套接字内容几乎肯定会在另一个线程上发生;(2) WinForms 控件讨厌被其他线程直接访问;您将需要使用他们的Invoke
方法来使事情发生在 UI 线程上。