gpt4 book ai didi

c# - 同步调用异步方法

转载 作者:行者123 更新时间:2023-11-30 16:13:13 28 4
gpt4 key购买 nike

由于我无法控制的原因,我需要同步调用一个异步方法。我正在开发一个库,它使用另一个异步工作的库,我需要从 Stream 类的实现中使用它。这样的类包含同步和异步方法,我对同步方法感到不安:

public override sealed int Read(byte[] buffer, int offset, int count)
{
// potential deadlock on single threaded synchronization context
return ReadAsync(buffer, offset, count).Result;
}

public override async Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
{
return await _lib.ReadAsync(buffer,offset,count);
}

我一直在读How would I run an async Task<T> method synchronously? , 特别是 this answer ,并且在评论中@Stephen Cleary 指出该解决方案并不好,因为某些 ASP.NET 部分需要 AspNetSynchronizationContext。我正在开发一个库,所以我不知道我的类将从哪里调用。

同步调用异步方法最安全的方法是什么?

最佳答案

Stephen Toub covers all the various approaches with their corresponding drawbacks在他的博客上。

只有两种通用的解决方案,但都不是理想的:

  1. 复制层中的逻辑;让您的同步方法调用库中的同步方法。 (这假设库同步方法和异步方法)。
  2. 阻止返回的任务,类似于您的示例代码。这假设库始终使用 ConfigureAwait(false),这是您无法控制的假设。如果库是上下文无关的,那么将异步调用放入 Task.Run 并阻塞该任务可能会更安全。此外,确保在阻塞任务时解包异常,因为 WaitResult 会将异常包装在 AggregateException 中。

这两种解决方案都存在一些严重的维护问题。

关于c# - 同步调用异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21987463/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com