C# 流:在单个过程中混合写入和写入同步
我试图用异步/等待的概念重写一些旧代码 考虑下一个简化代码:C# 流:在单个过程中混合写入和写入同步,c#,async-await,stream,C#,Async Await,Stream,我试图用异步/等待的概念重写一些旧代码 考虑下一个简化代码: 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(b
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();
}
公共异步任务Foo()
{
使用(var stream=new stream());//任何允许异步操作的流
....
流写入(0xff);
变量字节=新字节[];
//填充字节
wait stream.WriteAsync(字节,0,字节.长度);
....
流写入(0xff);
//重新填充字节
wait stream.WriteAsync(字节,0,字节.长度);
....
等待stream.FlushAsync();
}
所以我的问题是:在同一个过程中混合使用
Write
和WriteAsync
调用安全吗?这里会有什么陷阱?提前感谢。该方法是安全的,因为在隔离状态下,它将按照您的意愿运行:每个写入/WriteAsync
都将按顺序进行,因为异步写入正在等待
尽管如此,从调用方的角度来看,在实现中混合使用sync和async远远不够理想
调用方看到一个异步方法,会(正确地)假定它是非阻塞的
事实并非如此,因为Foo
一直同步执行,直到第一个wait
,这将在该持续时间内阻止调用线程
在某些情况下,异步方法必须在异步工作之前运行一些昂贵的CPU代码,但这不是其中之一;最好每次写入都使用WriteAsync
。我认为这是安全的,因为如果WriteAsync在下一行完成,则使用wait和main。是的,如果在调用write
之前完成WriteAsync
是安全的。