【问题标题】:Stream: mix Write and WriteAsync in a single procedureStream:在一个过程中混合 Write 和 WriteAsync
【发布时间】:2020-07-12 10:10:55
【问题描述】:

我正在尝试用 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 调用是否安全?这里有什么陷阱?提前致谢。

【问题讨论】:

  • 我认为它是安全的,因为您使用 await 并且如果 writeAsync 完成,则它主要进入下一行。
  • 是的,如果在调用Write 之前完成WriteAsync 是安全的。

标签: c# async-await stream


【解决方案1】:

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

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

调用者看到异步方法,会(正确地)假设它是非阻塞的。

情况并非如此,因为Foo 会同步执行直到第一个await,这会在这段时间内阻塞调用线程。

在某些情况下,异步方法必须在异步工作之前运行一些昂贵的 CPU 代码,但这不是其中之一;每次写入时最好使用WriteAsync

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-28
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多