[英]C# Ninject: How to bind to method async
我正在使用Ninject 3.2.2.0,我正在嘗試綁定異步方法。
這是我到目前為止所得到的:
kernel.Bind<Task<MyInterface>>().ToMethod(async ctx =>
{
var someData = await DoSomethingAsync();
return new SomethingElse(someData);
}).InRequestScope();
我的方法DoSomethingAsync
永遠不會被調用。 我相信它沒有被調用,因為正在請求MyInterface
,而不是Task<MyInterface>
。
有任何想法嗎?
對象圖的構造應該可靠且快速 。 這排除了做與I / O相關的任何事情。 這意味着,你不應該做任何是異步的 。
相反,任何緩慢,不可靠或異步的東西都應該在構建對象圖之后推遲。
我最終使我的綁定同步
kernel.Bind<MyInterface>().ToMethod(ctx =>
{
var someData = DoSomethingSync(); // <-- Made this one sync, see method below
return new SomethingElse(someData);
}).InRequestScope();
這是'魔術'。 我改變了我的方法:
private async Task<string> DoSomethingAsync() {
var result = await DoSomethingElseAsync();
return result;
}
至
private string DoSomethingSync() {
string result = null;
var runSync = Task.Factory.StartNew(async () => {
result = await DoSomethingElseAsync();
}).Unwrap();
runSync.Wait();
return result;
}
我知道由於上下文切換,性能受到影響,但至少它按預期工作,你可以確定它不會死鎖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.