C# Gui线程可以在套接字上写还是不正确?

C# Gui线程可以在套接字上写还是不正确?,c#,wpf,user-interface,C#,Wpf,User Interface,我想问一下,gui在套接字上写东西在语义上是否正确?这可能是个问题? GUI中存在阻塞的风险 提前感谢这取决于您如何配置套接字。当然,非阻塞套接字不会阻塞GUI线程。但依我看,由于在尝试发送时需要处理非致命的发送失败,因此编写代码要困难得多 IMHO更好的模型是利用套接字提供的异步范例之一。不幸的是,System.Net.Sockets.Socket类尚未更新以适应C#中新的异步/等待功能。但它仍然有两个非常有用的异步模型可供选择(要么是原始的“Begin/EndXXX”模型,要么是“XXXAs

我想问一下,gui在套接字上写东西在语义上是否正确?这可能是个问题? GUI中存在阻塞的风险


提前感谢

这取决于您如何配置套接字。当然,非阻塞套接字不会阻塞GUI线程。但依我看,由于在尝试发送时需要处理非致命的发送失败,因此编写代码要困难得多

IMHO更好的模型是利用套接字提供的异步范例之一。不幸的是,System.Net.Sockets.Socket类尚未更新以适应C#中新的异步/等待功能。但它仍然有两个非常有用的异步模型可供选择(要么是原始的“Begin/EndXXX”模型,要么是“XXXAsync”模型,尽管它的名字并不直接与async/await一起工作)

如果您愿意使用TcpListener、TcpClient和streams来使用更高级的API,那么您可以使用async/Wait,这可能为您编写代码提供了一种更简单的方法。我在前面的讨论中发现了这一点,其中有人发布了一个简短的示例,展示了如何做到这一点:

一般来说,任何长时间运行或可能阻塞的操作都应该在后台线程上进行,以维护响应的GUI。如果内部传输缓冲区已满,套接字写入可能会阻塞。在GUI线程和发送方线程之间执行线程安全阻塞队列也是一个很好的解决方案?我根本不会将线程专用于I/O。.NET已经为您做到了这一点,有了专用的IOCP线程池,当您为Socket使用异步API时,您可以“免费”使用该线程池(我假设用于基于Socket的更高级别的类,如TcpListener/Client,但我不太清楚)GUI和发送方线程之间的线程安全阻塞队列“这是一个很好的解决方案。好的,我读过关于这个范例的不同主题。但不幸的是,我还没有解决我的问题。。我会解释得更好。。。我正在用c#实现一个远程控制应用程序。我有一个服务器应用程序,一次可以接收1个连接->所以它不需要异步特性。而我的客户机应用程序接收(键关闭)之类的事件,并且必须将其传输到服务器应用程序。问题是,我不希望它也写在一个套接字上,因为它可以阻止gui。。。我可以用这个范例来解决吗?当然可以。我建议的方法专门解决了“不要通过写入套接字来阻塞GUI”的问题。仅仅因为您没有处理多个连接,这并不意味着异步技术没有用处。