我应该在ASP.NETCore中从哪里开始持久化后台任务?在我的Web应用程序(ASP.NETCore)中,我想在后台运行一个正在侦听远程服务器的作业,计算一些结果并将它们推送到Pusher上的客户端(websocket)。我不确定应该从哪里开始这项任务。目前我在Startup.cs的末尾执行publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv)但我认为这有问题,在名为“Configure”的方法中启动后台作业没有意义。我期待在某处找到Start方法此外,当我尝试使用EFCore生成初始数据库迁移文件时,它实际上执行该方法并开始我的任务..这显然没有意义:dotnetefmigrationsaddInitialCreatefrom从控制台运行它会创建迁移代码,该代码将用于根据我的数据模型在SQLServer上创建数据库。为什么我没有办法开始任务?我不希望这是一个单独的进程,它实际上不需要自己的进程,它本质上是Web服务器的一部分,并且由于它确实通过websockets与客户端(浏览器)通信,所以它会有意义作为Web服务器的一部分运行。我相信你正在寻找这个https://blogs.msdn.microsoft.com/cesardelatorre/2017/11/18/implementing-background-tasks-in-microservices-with-ihostedservice-and-the-backgroundservice-class-net-core-2-x/我做了一个2小时的自我奖励黑客马拉松来学习。https://github.com/nixxholas/nautilus你可以在这里参考注入并从那里实现抽象。许多MVC项目并不真正需要运行持久的后台任务。这就是为什么您没有看到它们通过模板被烘焙到一个全新的项目中。最好能提供一个接口让开发者点击继续使用。此外,关于为此类后台任务打开套接字连接,我还没有为此构建解决方案。据我所知/所做的,我只能向连接到我自己的socketmanager的客户端广播有效负载,所以你必须去别处看看。如果IHostedService中有任何关于websockets的内容,我肯定会发出哔哔声。好吧,无论如何这里发生了什么。把它放在你项目的某个地方,它更像是一个接口,让你可以重写以创建你自己的任务///Copyright(c).NETFoundation.LicensedundertheApacheLicense,Version2.0。//////实现长时间运行的基类。///公共抽象类BackgroundService:IHostedService,IDisposable{protectedreadonlyIServiceScopeFactory_scopeFactory;私有任务_executingTask;privatereadonlyCancellationTokenSource_stoppingCts=newCancellationTokenSource();publicBackgroundService(IServiceScopeFactoryscopeFactory){_scopeFactory=scopeFactory;}protectedabstractTaskExecuteAsync(CancellationTokenstoppingToken);publicvirtualTaskStartAsync(CancellationTokencancellationToken){//存储我们正在执行的任务_executingTask=ExecuteAsync(_compendingCts)sk//Tok然后返回它,//这将向调用者冒泡取消和失败if(_executingTask.IsCompleted){返回_executingTask;}//否则它正在运行returnTask.CompletedTask;}publicvirtualasyncTaskStopAsync(CancellationTokencancellationToken){//在没有开始的情况下停止调用if(_executingTask==null){return;}try{//向执行方法发出取消信号_stoppingCts.Cancel();}finally{//等到任务完成或停止令牌触发awaitTask.WhenAny(_executingTask,Task.Delay(Timeout.Infinite,cancellationToken));}}publicvirtualvoidDispose(){_stoppingCts.Cancel();}}下面是你实际使用它的方法scope=_scopeFactory.CreateScope()){vardbContext=scope.ServiceProvider.GetRequiredService();Console.WriteLine("[IncomingEthTxService]服务正在运行");//运行一些东西awaitTask.Delay(5,stoppingToken);}}}如果您注意到,那里有一个好处您必须使用服务范围来访问数据库操作,因为它是一个单例。注入您的服务C#教程到此结束:我应该在ASP.NETCore中的何处启动持久后台任务?如果分享的内容对你有用,需要了解更多C#学习教程,希望大家多多关注——//后台服务依赖services.AddSingleton();本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
