![]() |
1
12
您需要使用netstream read中的回调来处理这个问题。坦率地说,将复制逻辑包装到它自己的类中可能会更容易,这样您就可以维护活动流的实例。 这就是我如何处理它(未测试):
|
![]() |
2
52
尽管帮助人们做家庭作业是有悖常理的,但考虑到这已经有一年多了,以下是实现这一目标的正确方法。你所需要的一切 重叠 您的读/写操作-不需要生成其他线程或任何其他操作。
干杯。 |
![]() |
3
16
我怀疑这是最快的代码(有一些来自.NET任务抽象的开销),但我确实认为这是 清洁剂 整个异步复制的方法。
我需要一个
调查结果:
这是我找到的,还有 the complete source code 对于我用来测试这个的程序。在我的机器上,这些测试是在一个SSD磁盘上运行的,相当于一个文件副本。通常情况下,您不希望将其用于复制文件,而是当您有一个网络流(这就是我的用例)时,这就是您想要使用类似这样的东西的时候。
在这里,您可以看到运行测试时的流程资源管理器性能图。基本上每个
顶部
(在三个图的下一个)是串行测试的开始。您可以清楚地看到,随着缓冲区大小的增长,吞吐量是如何大幅增加的。它看起来好像计划在80K左右,这就是.NET框架
这里的好处是最终实现没有那么复杂:
尽管存在巨大的缓冲区,这种交错读/写的方法比BCL快18%。
出于好奇,我确实将异步调用更改为典型的开始/结束异步模式调用,这一点并没有改善情况,反而使情况更糟。尽管我喜欢抨击任务抽象开销,但当您使用async/await关键字编写代码时,它们会做一些漂亮的事情,而且阅读代码会更好! |
![]() |
4
11
哇,这些都很复杂!这是我的异步解决方案,它只是一个函数。read()和beginwrite()同时运行。
|
![]() |
5
9
奇怪的是没有人提到过TPL。
还可以考虑使用J.Richer's AsyncEnumerator . |
![]() |
6
0
你是对的,你所做的基本上是同步读取,因为你使用waitone()方法,它只是停止执行直到数据准备好,这基本上与使用read()而不是beginread()和endread()相同。 您需要做的是,在beginread()方法中使用回调参数,然后定义回调方法(或lambda表达式),在读取信息时将调用此方法(在回调方法中,您必须检查流的结尾并写入输出流),这样就不会阻塞主THREAD(您不需要waitone()或endread()。 希望这有帮助。 |
![]() |
Coding Dog · Python异步函数不工作。继续跑 1 年前 |
![]() |
cyka · 强制JavaScript等待单击(循环) 2 年前 |
![]() |
CodeMonkey · 无法访问React[重复]中的对象值 2 年前 |
![]() |
Tim · 为异步方法返回列表的最佳方式是什么? 2 年前 |
![]() |
dapidmini · 未捕获的承诺嵌套异步函数承诺错误处理 2 年前 |