繁体   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