我正在考虑以下办法,但不确定这是否最好的出路:
step1 (服务器端):一个TaskMangaer类创建一个新线程并启动一个任务。
step2 (服务器端):将taskManager对象引用存储到缓存中以供将来参考。
step3 (客户端):使用周期性的Ajax调用来检查任务的状态。
基本上,它的意图是有一个框架来运行一个后台任务(5分钟左右),并为完成任务的百分比提供关于web的定期反馈。
在此或现有的asp.net API中是否有一种很好的方法来帮助您呢?
编辑1#:我想用这个应用程序运行-proc中的任务。
编辑2#:看起来就像堆栈溢出上的徽章实现一样,也使用缓存来跟踪后台任务。https://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/
发布于 2008-12-24 09:47:45
我认为将结果存储在缓存中的问题是,ASP.NET可能为了其他目的而清除该缓存条目(即内存不足、不稳定等等)。从缓存中提供的内容应该是您可以根据需要重新创建的东西,如果在缓存中找不到它,那么ASP.NET运行时可以随时转储缓存条目。
在警徽讨论中,缓存的使用似乎从根本上不同,在这种情况下,任务是短暂的。缓存只是作为一个黑客计时器来周期性地触发任务。
你能确认这是一个需要5分钟的任务,并且需要它自己的线程吗?这本身就是一个性能问题,如果每个请求都需要自己的线程这么长时间,您将只能支持有限数量的此类请求。如果这是可以接受的,我才会让这个任务持续这么长时间。
如果这些任务可以扎营一个线程,那么我只需继续将结果存储在一个全局字典中。字典的键将与客户端请求/ AJAX回调系列相关联。如果安全性非常重要,则密钥还应该包含用户ID。
如果您需要扩展到许多用户,那么我认为您需要将任务分解为异步步骤,在这种情况下,我可能会使用DB表来存储结果(同样按请求/用户键键)。
发布于 2008-12-24 06:16:33
Microsoft是为您试图解决的方案而构建的:http://www.microsoft.com/windowsserver2003/technologies/msmq/default.mspx也有消息队列支持。希望这能有所帮助。
托马斯
发布于 2008-12-24 07:40:40
其中一种方法是使用应用程序状态。生成工作线程时,将生成的请求ID传递给它,并将其返回给客户端。然后,客户机将在其AJAX调用中将该请求ID传回给服务器。然后,服务器将使用请求ID从应用程序状态获取状态。(辅助线程将根据其状态更新应用程序状态)。
https://stackoverflow.com/questions/390863
复制相似问题