尝试这样做需要使用奇怪的语法
GetAwaiter().GetResult()
。
除此之外,它确实有效;但这样做很糟糕吗?如果是,那为什么?
原文:
internal static ISector Read(ISector sector, Stream stream)
{
using var scope = new ArrayPoolScope<byte>(GetLength(sector));
stream.ReadExactly(scope.Span);
var result = Read(sector, scope.Span);
return result;
}
internal static async Task<ISector> ReadAsync(ISector sector, Stream stream)
{
using var scope = new ArrayPoolScope<byte>(GetLength(sector));
await stream.ReadExactlyAsync(scope.Memory);
var result = Read(sector, scope.Span);
return result;
}
修改:
internal static ISector Read(ISector sector, Stream stream)
{
var result = ReadAsync(sector, stream).GetAwaiter().GetResult();
return result;
}
internal static async Task<ISector> ReadAsync(ISector sector, Stream stream)
{
using var scope = new ArrayPoolScope<byte>(GetLength(sector));
await stream.ReadExactlyAsync(scope.Memory);
var result = Read(sector, scope.Span);
return result;
}
在C#中使用GetAwaiter().GetResult()同步等待异步操作完成。此调用会阻塞当前线程,直到任务完成,这可能会导致几个问题。
我想让你知道,使用 await 对于释放当前线程直到任务完成非常重要。减少资源,而不是阻塞当前线程空闲等待任务完成被释放,而是可以处理其他请求,一旦任务完成,将保留一个新线程,或者可能保留同一线程来继续旧线程的执行路径.