Jam*_*mes 12 c# stream filestream async-await c#-5.0
我一直在试图实现一个Stream支持ReadAsync和WriteAsync,并给予的spareseness 文档,我挣扎,以了解如何正确地这样做.具体来说,就流的光标位置而言.这里和这里有关于旧BeginRead功能的类似问题.该函数的文档似乎表明,BeginRead在任何挂起的异步操作完成之前不应再次调用.
鉴于BeginRead现在过时 不再建议新的发展,并Stream可能已经被显著改变,以实施新的异步功能,事情再次不清楚.(编辑:通常这种警告意味着新函数是直接实现的,旧函数调用新函数,并且仅用于向后兼容,但这似乎并非如此).
在ReadAsync和WriteAsync函数定义,使得它们不采取所需的读/写流位置作为自己的Win32 同行做(在我看来,一个非常贫穷的设计选择),而是依赖于由流实现保持的当前位置.如果两个条件之一成立,那么情况就好了:
ReadAsync并且WriteAsync必须获取当前光标位置以供操作使用并更新它,就好像操作完成(或根本不更新)返回之前Task,或者ReadAsync或WriteAsync可以调用.在这两个条件之外,调用者永远无法确定读或写将发生的位置,因为挂起的异步操作可能会在任何Seek调用ReadAsync或调用之间改变流的位置WriteAsync.这些条件都没有记录为要求,所以我不知道它应该如何运作.
我的白盒测试似乎表明,至少对于FileStream版本Stream,流位置异步更新,这似乎表明第二个条件(只允许一个待处理操作)仍然是需要的那个,但这似乎是一个严重的限制(它肯定会排除任何类型的内部分散 - 聚集实现).
任何人都可以提供任何类型的权威信息,以确定旧的BeginRead限制是否仍然适用ReadAsync?
任何人都可以提供任何类型的权威信息,以确定旧的
BeginRead限制是否仍然适用ReadAsync?
同样的限制适用于BeginRead和ReadAsync.
旧的APM方法尚未弃用.它们仍然得到完全支持,使用它们没有任何问题.但是,这些async方法更容易使用,因此文档建议使用它们.
async这些旧类的所有这些"重载"通常仍然包括调用BeginXXX和/ EndXXX或最多两个选项调用共享方法(例如FileStream.BeginReadAsync).我从未见过任何具有APM包装方法的代码(在框架中或其他方面)async.
因此,呼叫ReadAsync将导致呼叫,BeginRead因此任何限制都适用于两者.此外,由于Stream它不是线程安全的,并且不作为并发安全(稍微不同)进行通告,因此可以安全地假设您不能同时使用async请求泛滥它.