在启动时调用 AddTransient 中的异步方法 - Asp.Net Core

Emm*_*rai 6 c# startup async-await asp.net-core

我有一个用于获取一些信息的服务,并且该方法在链中有一堆异步调用。

public interface IFooService
{
    Task<IFoo> GetFooAsync();
}
Run Code Online (Sandbox Code Playgroud)

具体类,

public class FooService : IFooService
{
    public async Task<IFoo> GetFooAsync()
    {
        // whole bunch of awaits on async calls and return IFoo at last
    }
}
Run Code Online (Sandbox Code Playgroud)

我在 StartUp 上注册了这个服务,

services.AddTransient<IFooService, FooService>();
Run Code Online (Sandbox Code Playgroud)

此服务注入了其他几个服务。其中之一,

public class BarService : IBarService
{
    private readonly IFooService _fooService;

    public BarService(IFooService fooService)
    {
        _fooService = fooService;
    }

    public async Task<IBar> GetBarAsync()
    {
        var foo = await _fooService.GetFooAsync();

        // additional calls & processing
        var bar = SomeOtherMethod(foo);

        return bar;
    }
}
Run Code Online (Sandbox Code Playgroud)

IFoo是应用程序不可或缺的一部分,并在多个服务中使用。我的大部分代码async只是由于这个IFooService和它返回的一种方法IFoo

考虑到这个用例,我希望能够只注入IFoo所有其他服务,而不是使用IFooService.

我试了一下,

services.AddTransient<IFoo>(provider => 
{
    var fooService = provider.GetService<IFooService>();
    var foo = fooService.GetFooAsync().GetAwaiter().GetResult();
    return foo;
});
Run Code Online (Sandbox Code Playgroud)

但它向我提出了一个危险信号,因为我正在通过异步进行同步,我不确定这是否会导致任何问题,例如竞争条件。这样做会阻止启动。我正在寻找一种干净的方法来处理这个问题,当我们需要这样的东西时有什么建议吗?感谢您的帮助。

Tao*_*hou -2

但当我在异步上进行同步时,它向我发出了一个危险信号

对于这个危险信号,是由于您调用了GetFoo未在 中定义的方法引起的IFooService,它与异步或同步方法无关。

尝试一下定义的方法

services.AddTransient<IFoo>(provider =>
{
    var fooService = provider.GetService<IFooService>();
    var foo = fooService.GetFooAsync().Result;
    return foo;
});
Run Code Online (Sandbox Code Playgroud)

  • `.Result` 与 `.GetAwaiter().GetResult()` 具有几乎相同的效果,只是它更容易出现死锁。你为什么会建议它? (2认同)