Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.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# 为什么我应该使用BeginWrite而不是Write?_C#_Networkstream - Fatal编程技术网

C# 为什么我应该使用BeginWrite而不是Write?

C# 为什么我应该使用BeginWrite而不是Write?,c#,networkstream,C#,Networkstream,我正在从事一项管理多达30000个远程设备的服务 在进行一些负载测试时,异步方法BeginWrite似乎比常规写入使用更多的资源(我认为这是由于创建回调线程所需的开销);另一方面,Write方法的返回速度总是比BeginWrite快 所以我的问题是:为什么选择BeginWrite 另一个问题是:有没有理由为同步写入设置WriteTimeout?在哪些情况下,Write方法不会立即生成异常(例如,由于套接字关闭),但不会在合理的时间内完成 编辑:我有一组工作线程(32或64),因此我一次将数据发送

我正在从事一项管理多达30000个远程设备的服务

在进行一些负载测试时,异步方法BeginWrite似乎比常规写入使用更多的资源(我认为这是由于创建回调线程所需的开销);另一方面,Write方法的返回速度总是比BeginWrite快

所以我的问题是:为什么选择BeginWrite

另一个问题是:有没有理由为同步写入设置WriteTimeout?在哪些情况下,Write方法不会立即生成异常(例如,由于套接字关闭),但不会在合理的时间内完成


编辑:我有一组工作线程(32或64),因此我一次将数据发送到500-1000个设备,并且Write似乎比BeginWrite工作得更好

编辑2:经过一点搜索,我了解到只有在写入缓冲区已满时,同步写入才会挂起。默认写缓冲区大小是8KB,我一次只发送1-2KB的数据,所以在我的应用程序中,写应该永远不会挂起,而BeginWrite的性能更好。我将安全写入时间设置为1秒。

可伸缩性


同步调用在完成时阻塞线程。异步方法不会。根据您要处理的并发请求的数量,这可能很重要。

您是否同时向所有远程设备发送数据?你能给我们看一下你测试的代码吗?我一次向500-1000台设备发送数据。这是一个非常大的项目,所以显示代码并不简单。想象一下32个工作线程在内核上争夺时间和访问网络。。。调度这些等待线程的开销可能会对性能产生重大影响。我同意你的观点,所以我来讨论第二个问题:如何管理写入超时以同步写入?如果写操作挂起(但为什么会发生这种情况?),我永远不会继续写由同一工作线程管理的其他设备。这就是我尝试使用异步写的原因,但我在测试中看到,即使有大量(500-1000)的当代写操作,写操作也能更好地工作(但在不同的套接字上,所以不是并发写入)。好吧,始终测量,因为YMMV。尽管如此,1000可能是您现在的最大值,但在将来……并且您试图保存的不是特定通道(本例中为套接字)——而是线程。它们是有限的资源。