[英]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 其他選項
注入 Func<Task> 作為瞬態,調用者可以等待!
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.