c# - 过程执行完成后网页挂起

标签 c# oracle

我有一个接受 excel 文件的网页,从中读取数据并将其存储在缓冲表中。然后调用从该缓冲表中读取的过程,并且每条记录都经过多次验证。程序完成后,我从后面的代码中删除缓冲区表内容。我已经使用大约 100 条记录执行了这段代码,它会在几秒钟内执行。但是,当记录大小增加(比如大约 2000)时,该过程需要超过 5 分钟才能执行,但网页会挂起。我查了表,插入记录和删除缓冲表大概需要6-7分钟,但是30分钟后网页没有返回结果。我已经尝试优化程序,但仍然在大量记录的情况下网页挂起。

请给我一些关于如何避免这种页面挂起情况的指导。任何帮助都会很棒。提前致谢

最佳答案

我认为您应该做的第一件事是将您的插入包装到事务中。

如果单个事务的记录太多,您可以每 n 条记录(比如 500)执行一次提交。

就网页返回而言,您可能会遇到某种超时,此时 IIS 或客户端放弃了请求,或者如果您使用数据更新页面,则可能有无效数据导致页面出错。

为此,您应该检查 Windows 事件日志以查看 IIS 或 ASP.Net 是否报告任何异常。您还可以运行 fiddler查看请求发生了什么。

最后,我强烈建议重新设计,不需要用户在屏幕上等待提交的表单,直到处理完成。

我们用于此类功能的标准模式是使用 GUID 在数据库中记录传入请求,启动后台工作程序来执行任务,然后将 GUID 返回给客户端。

当后台工作人员完成(或遇到错误)时,它会使用新状态(即成功或失败)和错误消息(如果有)更新数据库中的请求表。

客户端可以使用GUID定期向web服务器发出ajax请求(使用window.timeout以免阻塞用户并允许显示动画)来判断进程是否完成。该过程完成后,可以根据需要更新 UI。

更新

要使用 GUID 在数据库中记录传入请求,请创建一个表,其中包含作为主键的 GUID 列、状态列(3 个值:进行中、成功、失败)和错误消息列。

收到请求后,在您的代码中创建一个新的 GUID,然后在启动后台工作程序之前使用此 GUID 和进行中状态向这个新表写入一条记录。

您会将 GUID 传递给后台工作程序,以便它可以在完成时更新表(它只是将该状态更新为完成或错误并记录错误消息,如果有的话)。

您还将通过 javascript 将 GUID 传回客户端,以便客户端可以定期要求 Web 服务器使用 GUID 对表执行查询,以确定请求何时不再进行。

关于c# - 过程执行完成后网页挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8686275/

相关文章:

sql - Oracle : Query Runs Successfully, 但列名不可用

python - 有没有办法在 Python 中对 1900 年之前的日期使用类似 strftime 的函数?

c# - Stream.Read什么时候返回?

c# - 在 C# 中比较两个字符串数组

c# - Entity Framework - 大写第一个属性名称字母

sql - 对于Oracle中的NUMBER列,指定长度是否有助于提高性能?

mysql - 如何在 Ruby on Rails 中实现数据库 View

c# - 为什么不能在 C# 中将 Powershell 作为常规进程调用

c# - 有没有一种简单的方法可以在 LINQ to Entities 中编写自定义函数?

c# - 是否无法在运行时或编译时更改 SSDL 内容(Visual Studio 2015 EntityFramework 数据库首先使用 Oracle)