Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 消防处观察员;忘记任务_Asp.net Core - Fatal编程技术网

Asp.net core 消防处观察员;忘记任务

Asp.net core 消防处观察员;忘记任务,asp.net-core,Asp.net Core,免责声明:我可能有个坏主意 我在ASP.NET5上有一个中间件。 此中间件处理请求并启动新的任务。这项任务主要用于统计目的。 中间件不关心此任务的结果 出于性能原因,我想继续ASP.NET管道,而不必等待“后台”任务 我认为有三种方法可以实现这一点: 1/启动任务,无Wait或.Wait()。不要关心未观察到的异常 2/在“观察者”中注册任务。观察者将观察所有任务,直到应用程序结束 3/使用服务总线和/或某种工作者角色/WebJob 我不喜欢这个解决方案 解决办法似乎太过分了 解决方案2/对我来

免责声明:我可能有个坏主意

我在ASP.NET5上有一个中间件。 此中间件处理请求并启动新的
任务
。这项任务主要用于统计目的。 中间件不关心此任务的结果

出于性能原因,我想继续ASP.NET管道,而不必等待“后台”任务

我认为有三种方法可以实现这一点:

1/启动任务,无
Wait
.Wait()
。不要关心未观察到的异常

2/在“
观察者
”中注册任务。观察者将观察所有任务,直到应用程序结束

3/使用服务总线和/或某种工作者角色/WebJob

我不喜欢这个解决方案

解决办法似乎太过分了

解决方案2/对我来说没问题,比如:

public class TaskObserver : IDisposable
{
    private readonly List<Task> _tasks = new List<Task>();
    public void RegisterTask(Task task)
    {
        _tasks.Add(task)
    }

    public void Dispose()
    {
        Task.WaitAll(_tasks.ToArray());
    }
}

// somewhere in the service configuration...
serviceCollection.AddSingleton<TaskObserver>();
公共类TaskObserver:IDisposable
{
私有只读列表_tasks=new List();
公共无效注册表任务(任务)
{
_任务。添加(任务)
}
公共空间处置()
{
Task.WaitAll(_tasks.ToArray());
}
}
//在服务配置中的某个位置。。。
serviceCollection.AddSingleton();
观察者将在应用程序结束时通过其容器进行处理。 我甚至可以添加一个
计时器
,定期清理已完成的任务


2/解决方案在ASP.NET 5上下文中是否正确?

底线是ASP.NET不是为执行非HTTP请求的工作而设计的。有一种方法(正如我在博客上描述的),但没有一种是万无一失的

另一方面,WebJobs正是为这种情况而设计的。所以最好的答案是“只使用WebJobs”。试试看;它们可能没有你想象的那么难


但是,如果您真的想在ASP.NET AppDomain中采用不太可靠的方式进行后台工作,那么可以尝试不同程度的黑客攻击。例如,如果您愿意依赖完整的.NET框架(不仅仅是核心),那么您可以使用
HostingEnvironment.QueueBackgroundWorkItem

Hangfire(google Hangfire.io)现在支持ASP.NET核心,甚至可以处理异步任务,它正是为此目的而构建的

我认为你是对的(一如既往!),除了ASP.NET 5中不包括
HostingEnvironment.QueueBackgroundWorkItem
。由于托管环境本身已经发生了实质性的变化,作为后台线程的任务问题也可能发生了变化吗?我不建议在web应用程序中添加后台任务。原因是,如果暂时没有请求,您的网站可能会关闭。正如Stephen所说,使用webjobs或其他进行后台处理的服务。@MattDeKrey:我希望QBWI在发布后将包含在
dnx452
/
dnx46
中。如果没有计划将其放入
dnxcore
。HostingEnvironment.QueueBackgroundWorkItem在ASP.NET 5中不可用,请不要尝试使用它。System.Web不存在,所以它可能会做意想不到的事情,或者干脆爆炸。WebJobs是Azure唯一的功能吗?看到了“每个开发者/年”,但错过了“永久”。非常有前途!更新: