首页 / C# / 如何将流复制到许多异步C#.NET流
如何将流复制到许多异步C#.NET流
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何将流复制到许多异步C#.NET流,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1767字,纯文字阅读大概需要3分钟。
内容图文
![如何将流复制到许多异步C#.NET流](/upload/InfoBanner/zyjiaocheng/655/ff966b78ceb140f3aa5528a8309fcad8.jpg)
我有TCP服务器,可以连续接收大数据.
我需要将此流广播给许多客户端.
更新:
我需要广播视频流.也许有现成的解决方案?
解决方法:
如果要异步执行此操作,则可以利用System.Threading.Tasks namespace.
首先,您需要一个Stream实例到Task的映射,可以等待完成:
IDictionary<Stream, Task> streamToTaskMap = outputStreams.
ToDictionary(s => s, Task.Factory.StartNew(() => { });
上面有一些开销,因为有一个浪费的Task实例,什么也不做,但是考虑到需要执行的Task实例和延续的数量,价格却很小.
从那里,您将从流中读取内容,然后异步将其写出到每个Stream实例中:
byte[] buffer = new byte[<buffer size>];
int read = 0;
while ((read = inputStream.Read(buffer, 0, buffer.Length)) > 0)
{
// The buffer to copy into.
byte[] copy = new byte[read];
// Perform the copy.
Array.Copy(buffer, copy, read);
// Cycle through the map, and replace the task with a continuation
// on the task.
foreach (Stream stream in streamToTaskMap.Keys)
{
// Continue.
streaToTaskMap[stream] = streaToTaskMap[stream].ContinueWith(t => {
// Write the bytes from the copy.
stream.Write(copy, 0, copy.Length);
});
}
}
最后,您可以通过调用以下命令来等待写入的所有流:
Task.WaitAll(streamToTaskMap.Values.ToArray());
有几件事要注意.
首先,由于将lambda传递给了ContinueWith,因此需要缓冲区的副本. lambda是一个封装缓冲区的闭包,由于它是异步处理的,因此内容可能会更改.每个连续都需要其自己的缓冲区副本才能读取.
这也是为什么对Stream.Write的调用使用Array.Length属性的原因.否则,将必须在循环的每次迭代中复制读取变量.
另外,能够在Stream类上使用BeginWrite/EndWrite方法将是更理想的选择.因为没有ContinueWithAsync方法来执行任务并继续执行异步方法,所以调用异步版本的read没有任何好处.
这是其中一种情况,为了充分利用异步操作,最好自己调用BeginWrite / EndWrite(以及BeginRead/EndRead).当然,这会更加复杂,因为您将无法封装Task提供的操作结果,并且如果使用匿名方法/闭包,则必须对缓冲区采取相同的预防措施.
内容总结
以上是互联网集市为您收集整理的如何将流复制到许多异步C#.NET流全部内容,希望文章能够帮你解决如何将流复制到许多异步C#.NET流所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。