Stream.ReadAsync和Stream.WriteAsync是否应该在返回之前或操作完成之后同步改变光标位置?

Jam*_*mes 12 c# stream filestream async-await c#-5.0

我一直在试图实现一个Stream支持ReadAsyncWriteAsync,并给予的spareseness 文档,我挣扎,以了解如何正确地这样做.具体来说,就流的光标位置而言.这里这里有关于旧BeginRead功能的类似问题.该函数的文档似乎表明,BeginRead在任何挂起的异步操作完成之前不应再次调用.

鉴于BeginRead现在过时 不再建议新的发展,并Stream可能已经被显著改变,以实施新的异步功能,事情再次不清楚.(编辑:通常这种警告意味着新函数是直接实现的,旧函数调用新函数,并且仅用于向后兼容,但这似乎并非如此).

ReadAsyncWriteAsync函数定义,使得它们不采取所需的读/写流位置作为自己的Win32 同行做(在我看来,一个非常贫穷的设计选择),而是依赖于由流实现保持的当前位置.如果两个条件之一成立,那么情况就好了:

  1. ReadAsync并且WriteAsync必须获取当前光标位置以供操作使用并更新它,就好像操作完成(或根本不更新)返回之前Task,或者
  2. 在完成所有先前的异步调用之前,不会调用ReadAsyncWriteAsync可以调用.

在这两个条件之外,调用者永远无法确定读或写将发生的位置,因为挂起的异步操作可能会在任何Seek调用ReadAsync或调用之间改变流的位置WriteAsync.这些条件都没有记录为要求,所以我不知道它应该如何运作.

我的白盒测试似乎表明,至少对于FileStream版本Stream,流位置异步更新,这似乎表明第二个条件(只允许一个待处理操作)仍然是需要的那个,但这似乎是一个严重的限制(它肯定会排除任何类型的内部分散 - 聚集实现).

任何人都可以提供任何类型的权威信息,以确定旧的BeginRead限制是否仍然适用ReadAsync

i3a*_*non 8

任何人都可以提供任何类型的权威信息,以确定旧的BeginRead限制是否仍然适用ReadAsync

同样的限制适用于BeginReadReadAsync.

旧的APM方法尚未弃用.它们仍然得到完全支持,使用它们没有任何问题.但是,这些async方法更容易使用,因此文档建议使用它们.

async这些旧类的所有这些"重载"通常仍然包括调用BeginXXX和/ EndXXX或最多两个选项调用共享方法(例如FileStream.BeginReadAsync).我从未见过任何具有APM包装方法的代码(在框架中或其他方面)async.

因此,呼叫ReadAsync将导致呼叫,BeginRead因此任何限制都适用于两者.此外,由于Stream它不是线程安全的,并且不作为并发安全(稍微不同)进行通告,因此可以安全地假设您不能同时使用async请求泛滥它.