使用未经管理的资源解雇并忘记

时间:2014-05-12 18:44:21

标签: c# asp.net asp.net-web-api task autofac

我在一个由owin驱动的web api项目中使用autofac。我来到了一个我需要的地方" Fire and Forget"一些数据处理。 这通常不是问题。但是,由于依赖关系是由autofac中间件管理的每请求生命周期范围控制的。我不能在我期待已久的async方法中使用未管理的资源(这是我需要做的)。

//for example...
public async Task<IEnumerable<MyThings>> GetThings(){
     var things = await _thingRepo.GetInterestingThingsAsync();
     //fire and forget. -- not awaiting
     InjectedObject.DoThingsAsync(things);
     return things;
}

这里的问题是我需要在DoThingsAsync内使用其他注入资源(非托管资源)。目前,这会因为Owin请求结束时被处置而中断。

我可以为每次调用创建一个子生命周期范围,但我希望他们可能更清洁地做这些事情。

1 个答案:

答案 0 :(得分:2)

<强>更新

随着.Net Framework 4.5.2的出现,我现在可以使用

HostingEnvironment.QueueBackgroundWorkItem哪个是首选因为它会在工作项完成之前阻止IIS回收。


我想我为我的用例找到了一个解决方案..

我只是在需要它的地方注入这个课程:

public class AsyncTask : IAsyncTask
{
    private ILifetimeScope _lifetimeScope;
    public AsyncTask(ILifetimeScope lifeTimeScope)
    {
        //disposed of by owning scope...
        _lifetimeScope = lifeTimeScope;
    }
    public async Task Fire<T>(Func<T,Task> asyncAction)
    {
        using (var scope = _lifetimeScope.BeginLifetimeScope())
        {
            await asyncAction(scope.Resolve<T>());
        }
    }
}
public interface IAsyncTask
{
    Task Fire<T>(Func<T, Task> action);
}

然后..

_asyncTask.Fire<IEmailService>(svc => svc.SendMillionsOfEmailsAsync(content));