【问题标题】:Redirecting Page whilst still executing slow Linq.DataContext.SubmitChanges() in ASP.NET重定向页面,同时仍在 ASP.NET 中执行慢速 Linq.DataContext.SubmitChanges()
【发布时间】:2011-04-29 07:35:34
【问题描述】:

对于 Intranet 应用程序,我有一个网页保存功能,可以对多个数据库表执行实质性操作。我正在使用 Linq2SQL,大约 20 秒的浏览器空闲时间被 3 个单独的 Linq.DataContext.SubmitChanges() 调用所吞噬。这些调用发生在 SaveButton 回发调用的代码末尾。

我希望在保存按钮操作中完成累积这些数据库更改所需的实际工作。但是,鉴于没有检测到问题或冲突,我想在此之后立即将用户重定向到另一个页面(这样他们就不必盯着屏幕做他们无法停止的事情。然后随着用户继续我想拨打所有SubmitChanges()

理想的工作流程:

void btnSaveClick() 
{
    CalculateChangeSetProcedure
    Redirect somewhere...
    SubmitChangesProcedure
}

所以我的问题是 Response.Redirect(..., true) 只会关闭东西。有什么方法可以用 ASP.NET 程序来做到这一点,还是必须在另一个线程上异步执行?

【问题讨论】:

  • 看起来我不会更改按钮事件,而是更改数据库提交代码以尽可能透明地使用 SqlBulkCopy。很棒的链接:Implementing SqlBulkCopy in Linq to Sql。它完全改变了我的插入时间。
  • 您可以将此作为答案发布并接受它,如果它对您有用。这样问题就结束了。

标签: c# .net asp.net linq-to-sql datacontext


【解决方案1】:

如果您尝试提交少量数据,那么您的空闲时间是不正常的。您可以做的第一件事是检查提交功能,看看有什么可以优化的。例如,如果您要提交 50 行并且在每行之后调用 SubmitChanges,这可能会显着减慢处理速度。这种情况下的解决方案是准备所有日期并立即提交。

另一种选择是调用为您提交更改的服务。这样,您的保存将异步完成,不会中断用户。服务完成后,您可以获得一些简单的 jQuery 弹出窗口或通知用户保存已完成(如果这很重要)。

【讨论】:

  • 数据量很大。开发数据库服务器上的 20 秒是对跨 3 个数据库的多个表进行数千次插入的结果。我一直在优化的旧代码用于提交许多小块,就像你警告的那样。我正在考虑您的单独 Web 服务方法...
  • 如果插入的数据太大,那么你应该小心ASP.net进程会在超时后被杀死。一种可能的解决方案实际上不是调用 Web 服务或另一个 ASP.NET 线程,而是调用 Windows 服务。这样线程就不会超时了。
【解决方案2】:

在进行重定向之前为 SubmitChanges() 调用启动一个单独的后台线程。

例如

void btnSaveClick() 
{    
      CalculateChangeSetProcedure
      ThreadPool.QueueUserWorkItem(new WaitCallback(this.SubmitTheStuff), null);
      Redirect somewhere..
}
private void SubmitTheStuff(object obj)
{
      SubmitChangesProcedure
}    

【讨论】:

  • 我已经尝试过了,但是当我将它推送到另一个线程时,我无法阻止 Linq.DataContext.SubmitChanges() 爆炸。
  • 是的。但至少浏览器应该在 SubmitChanges() 工作时重定向。 “吹起来”是什么意思?内存?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多