2012-12-27 155 views
0

我下面的TCP客户机/服务器的这个例子TCP客户机/服务器

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

我比较熟悉的WinForms比控制台应用程序,所以我决定重拍中的WinForms代码。我有相同形式的客户端和服务器代码。在初始化服务器时,表单在我使用AcceptSocket()后停滞不前,并且我无法使用按钮从客户端发起操作。这是否意味着我必须在单独的WinForms中编写客户端和服务器? =/

回答

2

你需要能够读取插座不占用你的UI线程。否则,窗口显示无响应。

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

第二种是使用接受/读取/写入函数的异步版本之一(BeginXXX/EndXXXXXXAsync,取决于您使用的API),它从线程池为您启动另一个线程。 (该Async版本居然没有抢到一个线程直到事件发生,而Begin/End可能会立即抢单。)除非你确实需要奉献一个新的线程来观看插座(你几乎从来没有真正做),我d更喜欢异步的东西。

无论哪种方式,你会想了解多线程一点。在这种情况下,你需要记住的大事情是(1)无论你如何做,你的套接字的东西几乎肯定会在另一个线程上发生;和(2)WinForms控件讨厌直接从其他线程访问;你需要使用他们的Invoke方法来改变UI线程上的东西。

+0

到目前为止,WinForm确实显得没有反应。想知道你是怎么知道的? =/ – CaTx

+0

@hoangnguyen:主要是试错。 :)我见过它发生。实际上,控制台应用也会发生;如果你想阅读,并在同一个线程写(SANS'Socket.Select'),你就会看到类似的丑陋。 – cHao

+0

THX超,看起来像我步入多线程现在。 – CaTx

3

您需要在单独的线程运行。确保您不会阻止UI线程,否则UI将无法响应。

+0

这意味着我可以在一个表上运行呢?如果我对线程不熟悉,是否意味着我需要两个表单来简化它? =/ – CaTx

+0

我该如何避免阻塞UI线程? – CaTx