使用非异步方法的异步版本 DRY 是否有意义?

问题描述 投票:0回答:1

尝试这样做需要使用奇怪的语法

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# asynchronous dry
1个回答
0
投票

在C#中使用GetAwaiter().GetResult()同步等待异步操作完成。此调用会阻塞当前线程,直到任务完成,这可能会导致几个问题。

  • 阻止当前线程。
  • UI 中的死锁(例如:Windows 窗体)。

我想让你知道,使用 await 对于释放当前线程直到任务完成非常重要。减少资源,而不是阻塞当前线程空闲等待任务完成被释放,而是可以处理其他请求,一旦任务完成,将保留一个新线程,或者可能保留同一线程来继续旧线程的执行路径.

© www.soinside.com 2019 - 2024. All rights reserved.