流:在单个过程中混合Write和WriteAsync



我正在尝试用async/await概念重写一些旧代码。

考虑下一个简化代码:

public async Task<bool> Foo()
{
using (var stream = new Stream()); // Any stream allowing async operations
....
stream.Write(0xff);
var bytes = new byte[];
// fill bytes
await stream.WriteAsync(bytes, 0, bytes.Length);
....
stream.Write(0xff);
// refill bytes
await stream.WriteAsync(bytes, 0, bytes.Length);
....
await stream.FlushAsync();
}

所以我的问题是:在同一过程中混合使用WriteWriteAsync调用是否安全?这里会有什么陷阱?提前谢谢。

该方法是安全的,因为在隔离状态下,它将按照您的意愿行事:每个Write/WriteAsync都将按顺序发生,因为正在等待异步写入。

话虽如此,从调用者的角度来看,在实现中混合使用同步和异步远远不够理想。

调用方看到一个异步方法,会(正确地(认为它是非阻塞的。

事实并非如此,因为Foo一直同步执行到第一个await,这将在该持续时间内阻塞调用线程。

有些情况下,异步方法必须在异步工作之前运行一些昂贵的CPU代码,但这不是其中之一;对于每次写入使用CCD_ 7将是优选的。

最新更新