我正在用ASP.NET Core服务器中的autofac注册If MsgBox("Would you like to populate the team lists?", vbOKCancel) = vbOK Then
'run your code
End If
。
我想在多个地方使用注册,但是我只想调用一次任务,问题是结果永远不会被丢弃
注册代码:
func<Task<T>>
使用代码:
var getItemMethod = GetType()
.GetMethod(nameof(GetItem), BindingFlags.NonPublic | BindingFlags.Instance)
.MakeGenericMethod(resultType);
builder.Register(c => getItemMethod.Invoke(this, new[] { c.Resolve(resultType), task}))
.As(importResultDelegate)
.InstancePerMatchingLifetimeScope(SCOPE_TAG);
private Func<T> GetItem<T>(object obj, MethodInfo task)
where T : class
{
T output = null;
return () => output ?? ((T)task.Invoke(obj, null))
.Tee(o => output = o);
}
这称为
public Constructor(Func<Task<Object>> objectFac)
var data = await objectFac();
由于using(var inner = scope.BeginLifetimeScope(SCOPE_TAG){}
从未被丢弃,导致服务器内存泄漏
我尝试使用T output
,但是它从未被调用。
答案 0 :(得分:1)
如果要由Autofac
处理它,则需要使用实现IDisposable
而不是Func<T>
的类。来自Autofac documentation:
要利用自动确定性处置的优势,您的组件 必须实现IDisposable。
否则,您需要手动处理工厂生产的T
对象。