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