我正在考虑以下方法,但不确定它是否是最好的出路:
step1(服务器端):TaskMangaer类创建一个新线程并启动一个任务.
step2(服务器端):将taskManager对象引用存储到缓存中以供将来参考.
step3(客户端):使用定期Ajax调用来检查任务的状态.
基本上,目的是建立一个框架来运行后台任务(约5分钟),并在Web UI上提供有关任务完成百分比的定期反馈.
有没有一个巧妙的方法围绕这个或任何现有的asp.net API有用吗?
编辑1#:我想用应用程序在进程中运行任务.
编辑2#:看起来堆栈溢出上的徽章实现也使用缓存来跟踪后台任务. http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/
解决方法
我认为将结果存储在缓存中的问题是ASP.NET可能会为了其他目的而清除缓存条目(即,如果它的内存不足,如果它的脾气暴躁等).如果在缓存中找不到缓存,则可以根据需要重新创建缓存中的内容,ASP.NET运行时可以随时转储缓存条目.
徽章讨论中缓存的使用似乎根本不同,在这种情况下,任务是短暂的.缓存只是被用作hacky计时器来定期启动任务.
你能否确认这是一项需要5分钟的任务,并且整个时间都需要自己的线程?这本身就是一个性能问题,如果每个请求都需要自己的线程这么长时间,你将只能支持有限数量的此类请求.只有在可以接受的情况下,我才会让任务阵营长期存在.
如果可以将这些任务放在一个线程中,那么我只需继续将结果存储在全局字典中.字典的关键字将与客户端请求/ AJAX回调系列相关联.如果安全性非常重要,密钥应该包含用户ID.
如果你需要扩展到许多用户,那么我认为你需要将任务分解为异步步骤,我可能会使用数据库表来存储结果(再次按每个请求/用户键入).