在ASP.Net应用程序中,用户单击网页上的按钮,然后通过事件处理程序在服务器上实例化对象,并调用该对象上的方法.该方法转到外部系统来做东西,这可能需要一段时间.所以,我想要做的是在另一个线程中运行该方法调用,以便我可以通过"您的请求已经提交"将控制权返回给用户.我很乐意这样做,虽然用户可以继续轮询对象的状态,但它会更好.
我不知道的是,即使用户会话过期,IIS是否允许我的线程继续运行.想象一下,用户触发事件并在服务器上实例化对象并在新线程中触发该方法.用户对"您的请求已提交"消息感到满意并关闭其浏览器.最终,此用户会话将在IIS上超时,但该线程可能仍在运行,正在运行.IIS会允许线程继续运行还是会在用户会话到期后将其终止并处理掉对象?
编辑:从答案和评论,我知道这样做的最好方法是将长时间运行的处理移到IIS之外.除了其他一切,这涉及appdomain回收问题.在实践中,我需要在有限的时间内完成版本1并且必须在现有框架内工作,因此希望避免服务层,因此希望在IIS内部启动线程.实际上,这里的"长时间运行"只需几分钟,网站上的并发性很低,所以应该没问题.但是,下一个版本肯定需要拆分成一个单独的服务层.
我读过这些文章:
\n\n我什么时候应该在 Asp.Net Core 中使用 Task.Run?
\n是否允许在 ASP.NET Core 控制器中使用 Task.Run?
\n在第一篇文章中docs.microsoft我们可以看到这样的说法:
\n\n如果异步 API 可用,则异步调用数据访问、I/O 和长时间运行的操作 API。请勿使用 Task.Run 使\n同步 API 变为异步。
\n
我不太理解这个说法。我对应该在何时何地使用Task.Run以及何时何地应该(可以)编写异步 Web API 感到困惑。例如,考虑这个方法:
public int DoSomeHeavyWork()\n{\n // Consider heavy computations\n int i = 10;\n i = i * 2;\n i = i + 4;\n return i;\n}\nRun Code Online (Sandbox Code Playgroud)\n这个方法:
\npublic void SaveSomthingInDb(Order ord)\n{\n _dbContext.Orders.Add(ord);\n _dbContext.SaveChange();\n}\nRun Code Online (Sandbox Code Playgroud)\n根据上面的说法,我应该同步编写一个Web方法,因为没有async版本: …