Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 流:在单个过程中混合写入和写入同步_C#_Async Await_Stream - Fatal编程技术网

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
是安全的。