簡體   English   中英

在啟動時調用 AddTransient 中的異步方法 - Asp.Net Core

[英]Call async method in AddTransient in Startup - Asp.Net Core

我有一個用於獲取一些信息的服務,並且該方法在鏈中有一堆異步調用。

public interface IFooService
{
    Task<IFoo> GetFooAsync();
}

具體類,

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

我在 StartUp 上注冊了這個服務,

services.AddTransient<IFooService, FooService>();

此服務注入了其他幾個服務。 其中之一,

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;
    }
}

IFoo是應用程序不可或缺的一部分,並在多個服務中使用。 我的大部分代碼都是async只是因為這個IFooService和它具有的一種返回IFoo

考慮到這個用例,我希望能夠將IFoo注入所有其他服務,而不是將它們注入IFooService

我試了一下,

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

但它向我提出了一個危險信號,因為我正在通過異步進行同步,我不確定這是否會導致任何問題,例如競爭條件。 這樣做會阻止啟動。 我正在尋找一種干凈的方法來處理這個問題,當我們需要這樣的東西時有什么建議嗎? 感謝您的幫助。

2 其他選​​項

  1. 注入 Func<Task> 作為瞬態,調用者可以等待!

  2. Task.Run( async() await abc).Wait(); // 這種死鎖要少得多
    由於創建任務並且問題較少。

但是當我通過異步進行同步時,它向我發出了危險信號

對於這個紅旗,是由於您調用了GetFoo中未定義的IFooService ,與 async 或 sync 方法無關。

嘗試定義的方法

services.AddTransient<IFoo>(provider =>
{
    var fooService = provider.GetService<IFooService>();
    var foo = fooService.GetFooAsync().Result;
    return foo;
});
services.AddTransient<IFoo>(provider =>
{
    var fooService = provider.GetService<IFooService>();
    var foo = fooService.GetFooAsync().GetAwaiter().GetResult();
    return foo;
});

此選項比.Result稍好,因為.Result會將您的所有異常包裝到AggregateException並且您不會對我建議的代碼產生這種副作用。 也不要忘記這兩個選項不會異步運行,它會同步運行阻塞線程

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM