簡體   English   中英

C#Ninject:如何綁定到方法異步

[英]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.

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