Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TCP套接字连接中同步与异步的优势_C#_Sockets_Asynchronous_Synchronous - Fatal编程技术网

C# TCP套接字连接中同步与异步的优势

C# TCP套接字连接中同步与异步的优势,c#,sockets,asynchronous,synchronous,C#,Sockets,Asynchronous,Synchronous,我目前正在学习java背景的C语言。为了让我的脚湿我决定做一个简单的SMTP邮件应用程序。我很快就了解到C#同时支持同步和异步套接字 从我所看到的,使用同步套接字与异步套接字相比没有真正的优势,因为后者不会阻塞,因此不需要每次创建新线程。使用其中一个似乎也没有明显的开销 所以我的问题是,使用同步套接字有什么好处,还是在大多数情况下使用异步更好?这两种机制都可以工作。主要区别在于同步意味着要么阻塞本来可以做其他有用事情的线程,要么为每个连接指定一个线程。无论哪种方式,这都不能很好地扩展。对于只有很

我目前正在学习java背景的C语言。为了让我的脚湿我决定做一个简单的SMTP邮件应用程序。我很快就了解到C#同时支持同步和异步套接字

从我所看到的,使用同步套接字与异步套接字相比没有真正的优势,因为后者不会阻塞,因此不需要每次创建新线程。使用其中一个似乎也没有明显的开销


所以我的问题是,使用同步套接字有什么好处,还是在大多数情况下使用异步更好?

这两种机制都可以工作。主要区别在于同步意味着要么阻塞本来可以做其他有用事情的线程,要么为每个连接指定一个线程。无论哪种方式,这都不能很好地扩展。对于只有很少或只有一个活动连接的简单应用程序,这可能没问题


但是对于任何需要处理大量并发连接的场景,异步API是唯一能够提供足够性能的API。此外,在任何交互场景中(即,您必须处理用户输入和输出),异步方法更容易与用户界面集成。特别是现在我们在C#中有了
async
wait

异步IO保存线程。线程消耗(通常)1MB的堆栈内存。这是在并发未完成IO操作的数量变得很大时使用异步IO的主要原因。根据我的测量,在进入数千个线程之前,操作系统的可伸缩性不是一个问题

主要的缺点是,它需要更多的开发工作才能使相同的应用程序在相同的可靠性水平下工作

此外:


建议始终使用异步IO客观上是错误的。

与您使用的编程语言无关,建议仅使用异步套接字是错误的建议。诚然,所有问题都可以使用异步解决,但并非所有问题(例如,100000个连接)都可以使用同步解决。但大多数时候,问题往往更简单(这完全取决于具体情况,我想说,在99%的情况下,你会使用异步,在罕见的1%同步的情况下,你希望确保电子邮件确实发送,并且代码块完成,然后继续程序。此外,如果你为这个pourpose创建自己的线程,你也会使用同步。我作为假设是这样的。但我也认为你也可以用异步做同样的事情。或者我错了吗?@MuhammadHijazi你可以,你是对的。从功能上讲,使用异步或同步套接字没有什么区别。好的,太好了!谢谢!注意,对于正确的实现,同步API意味着一个线程r侦听器套接字和每个客户端连接两个线程。这取决于应用程序协议。简单的请求/响应协议不需要同时接收和发送,可以在单个线程中处理。只有在一切都完美的情况下。a“Simple”请求/响应协议无法检测到半开放状态,至少需要一个计时器来恢复。对不起……我不知道你的意思。为连接使用第二个线程如何解决半开放问题?除非你尝试发送,否则你仍然无法检测到该状态,并且如果协议不要求本地端恢复在收到数据之前发送,本地端将没有理由尝试。也许您可以提供一个链接,以进行更深入的讨论,详细说明您所说的内容。对不起,我的意思是协议本身无法检测到半开,无论它是同步的还是异步的。如果它是同步的,那么您需要一个计时器来关闭它wn是套接字(来自另一个线程),因此无论协议有多简单,都不可能采用严格的单线程方法。